@btc-vision/bitcoin 6.5.6 → 7.0.0-alpha.1
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 +57 -10
- 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 +12477 -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 +58 -11
- package/build/address.d.ts.map +1 -0
- package/build/address.js +82 -25
- 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 +202 -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 +35 -9
- package/build/payments/bip341.d.ts.map +1 -0
- package/build/payments/bip341.js +34 -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 -150
- 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 +428 -103
- 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 +465 -143
- 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 +117 -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 +406 -413
- 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 +101 -37
- 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 +169 -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 +68 -9
- package/scripts/bundle-ecc.ts +111 -0
- package/src/address.ts +91 -45
- package/src/bech32utils.ts +3 -3
- package/src/bip66.ts +34 -24
- package/src/block.ts +205 -86
- package/src/branded.ts +18 -0
- package/src/crypto.ts +64 -26
- package/src/ecc/context.ts +280 -0
- package/src/ecc/index.ts +14 -0
- package/src/ecc/types.ts +147 -0
- package/src/ecpair.d.ts +99 -0
- package/src/errors.ts +163 -0
- package/src/index.ts +112 -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 +32 -33
- package/src/payments/embed.ts +244 -41
- package/src/payments/index.ts +12 -10
- package/src/payments/p2ms.ts +497 -118
- package/src/payments/p2op.ts +432 -134
- package/src/payments/p2pk.ts +370 -72
- package/src/payments/p2pkh.ts +524 -130
- package/src/payments/p2sh.ts +572 -169
- package/src/payments/p2tr.ts +686 -194
- package/src/payments/p2wpkh.ts +482 -105
- package/src/payments/p2wsh.ts +524 -162
- package/src/payments/types.ts +80 -66
- package/src/psbt/bip371.ts +72 -51
- package/src/psbt/psbtutils.ts +39 -40
- package/src/psbt/types.ts +324 -0
- package/src/psbt/utils.ts +188 -0
- package/src/psbt/validation.ts +185 -0
- package/src/psbt.ts +608 -827
- package/src/pubkey.ts +22 -23
- package/src/push_data.ts +18 -16
- package/src/script.ts +81 -66
- package/src/script_number.ts +6 -6
- package/src/script_signature.ts +33 -36
- package/src/transaction.ts +462 -239
- package/src/types.ts +229 -100
- package/src/workers/WorkerSigningPool.node.ts +887 -0
- package/src/workers/WorkerSigningPool.ts +666 -0
- package/src/workers/ecc-bundle.ts +26 -0
- package/src/workers/index.ts +165 -0
- package/src/workers/psbt-parallel.ts +327 -0
- package/src/workers/signing-worker.ts +353 -0
- package/src/workers/types.ts +417 -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/typedoc.json +29 -0
- 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
package/src/payments/p2wpkh.ts
CHANGED
|
@@ -1,144 +1,521 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pay-to-Witness-Public-Key-Hash (P2WPKH) payment class.
|
|
3
|
+
*
|
|
4
|
+
* P2WPKH is the native SegWit version of P2PKH. The witness program is
|
|
5
|
+
* a 20-byte pubkey hash, and spending requires the signature and public key
|
|
6
|
+
* in the witness stack (not the scriptSig).
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
|
|
1
11
|
import { bech32 } from 'bech32';
|
|
2
12
|
import * as bcrypto from '../crypto.js';
|
|
3
|
-
import { bitcoin as BITCOIN_NETWORK } from '../networks.js';
|
|
13
|
+
import { bitcoin as BITCOIN_NETWORK, type Network } from '../networks.js';
|
|
4
14
|
import * as bscript from '../script.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
15
|
+
import type { Bytes20, PublicKey, Script, Signature } from '../types.js';
|
|
16
|
+
import { isPoint } from '../types.js';
|
|
17
|
+
import { equals } from '../io/index.js';
|
|
18
|
+
import { type P2WPKHPayment, type PaymentOpts, PaymentType } from './types.js';
|
|
8
19
|
|
|
9
20
|
const OPS = bscript.opcodes;
|
|
21
|
+
const EMPTY_BUFFER = new Uint8Array(0);
|
|
10
22
|
|
|
11
|
-
const EMPTY_BUFFER = Buffer.alloc(0);
|
|
12
|
-
|
|
13
|
-
// witness: {signature} {pubKey}
|
|
14
|
-
// input: <>
|
|
15
|
-
// output: OP_0 {pubKeyHash}
|
|
16
23
|
/**
|
|
17
|
-
*
|
|
24
|
+
* Pay-to-Witness-Public-Key-Hash (P2WPKH) payment class.
|
|
25
|
+
*
|
|
26
|
+
* Creates locking scripts of the form: `OP_0 {hash160(pubkey)}`
|
|
27
|
+
* Spending witness: `[{signature}, {pubkey}]`
|
|
18
28
|
*
|
|
19
|
-
* @
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import { P2WPKH } from '@btc-vision/bitcoin';
|
|
32
|
+
*
|
|
33
|
+
* // Create from public key
|
|
34
|
+
* const payment = P2WPKH.fromPubkey(pubkey);
|
|
35
|
+
* console.log(payment.address); // bc1q... bech32 address
|
|
36
|
+
* console.log(payment.output); // scriptPubKey
|
|
37
|
+
*
|
|
38
|
+
* // Create from bech32 address
|
|
39
|
+
* const fromAddr = P2WPKH.fromAddress('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4');
|
|
40
|
+
* console.log(fromAddr.hash); // 20-byte witness program
|
|
41
|
+
* ```
|
|
23
42
|
*/
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
opts = Object.assign({ validate: true }, opts || {});
|
|
43
|
+
export class P2WPKH {
|
|
44
|
+
// Static public fields
|
|
45
|
+
static readonly NAME = PaymentType.P2WPKH;
|
|
28
46
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
47
|
+
// Private instance fields
|
|
48
|
+
readonly #network: Network;
|
|
49
|
+
readonly #opts: Required<PaymentOpts>;
|
|
50
|
+
|
|
51
|
+
// Input data (provided by user)
|
|
52
|
+
#inputAddress?: string | undefined;
|
|
53
|
+
#inputHash?: Uint8Array | undefined;
|
|
54
|
+
#inputPubkey?: Uint8Array | undefined;
|
|
55
|
+
#inputSignature?: Uint8Array | undefined;
|
|
56
|
+
#inputOutput?: Uint8Array | undefined;
|
|
57
|
+
#inputWitness?: Uint8Array[] | undefined;
|
|
58
|
+
|
|
59
|
+
// Cached computed values
|
|
60
|
+
#address?: string | undefined;
|
|
61
|
+
#hash?: Uint8Array | undefined;
|
|
62
|
+
#pubkey?: Uint8Array | undefined;
|
|
63
|
+
#signature?: Uint8Array | undefined;
|
|
64
|
+
#output?: Uint8Array | undefined;
|
|
65
|
+
#input?: Uint8Array | undefined;
|
|
66
|
+
#witness?: Uint8Array[] | undefined;
|
|
67
|
+
|
|
68
|
+
// Cache flags
|
|
69
|
+
#addressComputed = false;
|
|
70
|
+
#hashComputed = false;
|
|
71
|
+
#pubkeyComputed = false;
|
|
72
|
+
#signatureComputed = false;
|
|
73
|
+
#outputComputed = false;
|
|
74
|
+
#inputComputed = false;
|
|
75
|
+
#witnessComputed = false;
|
|
76
|
+
|
|
77
|
+
// Decoded address cache
|
|
78
|
+
#decodedAddress?: { version: number; prefix: string; data: Uint8Array } | undefined;
|
|
79
|
+
#decodedAddressComputed = false;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Creates a new P2WPKH payment instance.
|
|
83
|
+
*
|
|
84
|
+
* @param params - Payment parameters
|
|
85
|
+
* @param params.address - Bech32 encoded address
|
|
86
|
+
* @param params.hash - 20-byte witness program (pubkey hash)
|
|
87
|
+
* @param params.pubkey - The public key (must be 33 bytes compressed)
|
|
88
|
+
* @param params.signature - DER-encoded signature
|
|
89
|
+
* @param params.output - The scriptPubKey
|
|
90
|
+
* @param params.witness - The witness stack [signature, pubkey]
|
|
91
|
+
* @param params.network - Network parameters (defaults to mainnet)
|
|
92
|
+
* @param opts - Payment options
|
|
93
|
+
* @param opts.validate - Whether to validate inputs (default: true)
|
|
94
|
+
*
|
|
95
|
+
* @throws {TypeError} If validation is enabled and data is invalid
|
|
96
|
+
*/
|
|
97
|
+
constructor(
|
|
98
|
+
params: {
|
|
99
|
+
address?: string | undefined;
|
|
100
|
+
hash?: Uint8Array | undefined;
|
|
101
|
+
pubkey?: Uint8Array | undefined;
|
|
102
|
+
signature?: Uint8Array | undefined;
|
|
103
|
+
output?: Uint8Array | undefined;
|
|
104
|
+
witness?: Uint8Array[] | undefined;
|
|
105
|
+
network?: Network | undefined;
|
|
39
106
|
},
|
|
40
|
-
|
|
41
|
-
)
|
|
107
|
+
opts?: PaymentOpts,
|
|
108
|
+
) {
|
|
109
|
+
this.#network = params.network ?? BITCOIN_NETWORK;
|
|
110
|
+
this.#opts = {
|
|
111
|
+
validate: opts?.validate ?? true,
|
|
112
|
+
allowIncomplete: opts?.allowIncomplete ?? false,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// Store input data
|
|
116
|
+
this.#inputAddress = params.address;
|
|
117
|
+
this.#inputHash = params.hash;
|
|
118
|
+
this.#inputPubkey = params.pubkey;
|
|
119
|
+
this.#inputSignature = params.signature;
|
|
120
|
+
this.#inputOutput = params.output;
|
|
121
|
+
this.#inputWitness = params.witness;
|
|
122
|
+
|
|
123
|
+
// Validate if requested
|
|
124
|
+
if (this.#opts.validate) {
|
|
125
|
+
this.#validate();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Public getters
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Payment type discriminant.
|
|
133
|
+
*/
|
|
134
|
+
get name(): typeof PaymentType.P2WPKH {
|
|
135
|
+
return PaymentType.P2WPKH;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Network parameters.
|
|
140
|
+
*/
|
|
141
|
+
get network(): Network {
|
|
142
|
+
return this.#network;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Bech32 encoded address (bc1q... for mainnet).
|
|
147
|
+
*/
|
|
148
|
+
get address(): string | undefined {
|
|
149
|
+
if (!this.#addressComputed) {
|
|
150
|
+
this.#address = this.#computeAddress();
|
|
151
|
+
this.#addressComputed = true;
|
|
152
|
+
}
|
|
153
|
+
return this.#address;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* 20-byte witness program (RIPEMD160(SHA256(pubkey))).
|
|
158
|
+
*/
|
|
159
|
+
get hash(): Bytes20 | undefined {
|
|
160
|
+
if (!this.#hashComputed) {
|
|
161
|
+
this.#hash = this.#computeHash();
|
|
162
|
+
this.#hashComputed = true;
|
|
163
|
+
}
|
|
164
|
+
return this.#hash as Bytes20 | undefined;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* The public key (33 bytes compressed).
|
|
169
|
+
*/
|
|
170
|
+
get pubkey(): PublicKey | undefined {
|
|
171
|
+
if (!this.#pubkeyComputed) {
|
|
172
|
+
this.#pubkey = this.#computePubkey();
|
|
173
|
+
this.#pubkeyComputed = true;
|
|
174
|
+
}
|
|
175
|
+
return this.#pubkey as PublicKey | undefined;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* The DER-encoded signature.
|
|
180
|
+
*/
|
|
181
|
+
get signature(): Signature | undefined {
|
|
182
|
+
if (!this.#signatureComputed) {
|
|
183
|
+
this.#signature = this.#computeSignature();
|
|
184
|
+
this.#signatureComputed = true;
|
|
185
|
+
}
|
|
186
|
+
return this.#signature as Signature | undefined;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* The scriptPubKey: `OP_0 {20-byte hash}`
|
|
191
|
+
*/
|
|
192
|
+
get output(): Script | undefined {
|
|
193
|
+
if (!this.#outputComputed) {
|
|
194
|
+
this.#output = this.#computeOutput();
|
|
195
|
+
this.#outputComputed = true;
|
|
196
|
+
}
|
|
197
|
+
return this.#output as Script | undefined;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* The scriptSig (always empty for native SegWit).
|
|
202
|
+
*/
|
|
203
|
+
get input(): Script | undefined {
|
|
204
|
+
if (!this.#inputComputed) {
|
|
205
|
+
this.#input = this.#computeInput();
|
|
206
|
+
this.#inputComputed = true;
|
|
207
|
+
}
|
|
208
|
+
return this.#input as Script | undefined;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Witness stack: `[signature, pubkey]`
|
|
213
|
+
*/
|
|
214
|
+
get witness(): Uint8Array[] | undefined {
|
|
215
|
+
if (!this.#witnessComputed) {
|
|
216
|
+
this.#witness = this.#computeWitness();
|
|
217
|
+
this.#witnessComputed = true;
|
|
218
|
+
}
|
|
219
|
+
return this.#witness;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Static factory methods
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Creates a P2WPKH payment from a compressed public key.
|
|
226
|
+
*
|
|
227
|
+
* @param pubkey - The public key (must be 33 bytes compressed)
|
|
228
|
+
* @param network - Network parameters (defaults to mainnet)
|
|
229
|
+
* @returns A new P2WPKH payment instance
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
* ```typescript
|
|
233
|
+
* const payment = P2WPKH.fromPubkey(pubkey);
|
|
234
|
+
* const address = payment.address; // bc1q...
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
static fromPubkey(pubkey: PublicKey, network?: Network): P2WPKH {
|
|
238
|
+
return new P2WPKH({ pubkey, network });
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Creates a P2WPKH payment from a bech32 address.
|
|
243
|
+
*
|
|
244
|
+
* @param address - Bech32 encoded address
|
|
245
|
+
* @param network - Network parameters (defaults to mainnet)
|
|
246
|
+
* @returns A new P2WPKH payment instance
|
|
247
|
+
*
|
|
248
|
+
* @example
|
|
249
|
+
* ```typescript
|
|
250
|
+
* const payment = P2WPKH.fromAddress('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4');
|
|
251
|
+
* const hash = payment.hash;
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
254
|
+
static fromAddress(address: string, network?: Network): P2WPKH {
|
|
255
|
+
return new P2WPKH({ address, network });
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Creates a P2WPKH payment from a 20-byte witness program.
|
|
260
|
+
*
|
|
261
|
+
* @param hash - 20-byte witness program (pubkey hash)
|
|
262
|
+
* @param network - Network parameters (defaults to mainnet)
|
|
263
|
+
* @returns A new P2WPKH payment instance
|
|
264
|
+
*/
|
|
265
|
+
static fromHash(hash: Bytes20, network?: Network): P2WPKH {
|
|
266
|
+
return new P2WPKH({ hash, network });
|
|
267
|
+
}
|
|
42
268
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
269
|
+
/**
|
|
270
|
+
* Creates a P2WPKH payment from a scriptPubKey.
|
|
271
|
+
*
|
|
272
|
+
* @param output - The scriptPubKey
|
|
273
|
+
* @param network - Network parameters (defaults to mainnet)
|
|
274
|
+
* @returns A new P2WPKH payment instance
|
|
275
|
+
*/
|
|
276
|
+
static fromOutput(output: Uint8Array, network?: Network): P2WPKH {
|
|
277
|
+
return new P2WPKH({ output, network });
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Private helper methods
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Converts to a plain P2WPKHPayment object for backwards compatibility.
|
|
284
|
+
*
|
|
285
|
+
* @returns A P2WPKHPayment object
|
|
286
|
+
*/
|
|
287
|
+
toPayment(): P2WPKHPayment {
|
|
47
288
|
return {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
289
|
+
name: this.name,
|
|
290
|
+
network: this.network,
|
|
291
|
+
address: this.address,
|
|
292
|
+
hash: this.hash,
|
|
293
|
+
pubkey: this.pubkey,
|
|
294
|
+
signature: this.signature,
|
|
295
|
+
output: this.output,
|
|
296
|
+
input: this.input,
|
|
297
|
+
witness: this.witness,
|
|
51
298
|
};
|
|
52
|
-
}
|
|
299
|
+
}
|
|
53
300
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
301
|
+
// Private computation methods
|
|
302
|
+
|
|
303
|
+
#getDecodedAddress(): { version: number; prefix: string; data: Uint8Array } | undefined {
|
|
304
|
+
if (!this.#decodedAddressComputed) {
|
|
305
|
+
if (this.#inputAddress) {
|
|
306
|
+
const result = bech32.decode(this.#inputAddress);
|
|
307
|
+
const version = result.words.shift();
|
|
308
|
+
const data = bech32.fromWords(result.words);
|
|
309
|
+
this.#decodedAddress = {
|
|
310
|
+
version: version ?? 0,
|
|
311
|
+
prefix: result.prefix,
|
|
312
|
+
data: new Uint8Array(data),
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
this.#decodedAddressComputed = true;
|
|
316
|
+
}
|
|
317
|
+
return this.#decodedAddress;
|
|
318
|
+
}
|
|
59
319
|
|
|
60
|
-
|
|
61
|
-
if (
|
|
320
|
+
#computeAddress(): string | undefined {
|
|
321
|
+
if (this.#inputAddress) {
|
|
322
|
+
return this.#inputAddress;
|
|
323
|
+
}
|
|
324
|
+
const h = this.hash;
|
|
325
|
+
if (!h) return undefined;
|
|
62
326
|
|
|
63
|
-
const words = bech32.toWords(
|
|
327
|
+
const words = bech32.toWords(h);
|
|
64
328
|
words.unshift(0x00);
|
|
65
|
-
return bech32.encode(network.bech32, words);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
if (
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
329
|
+
return bech32.encode(this.#network.bech32, words);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
#computeHash(): Uint8Array | undefined {
|
|
333
|
+
if (this.#inputHash) {
|
|
334
|
+
return this.#inputHash;
|
|
335
|
+
}
|
|
336
|
+
if (this.#inputOutput) {
|
|
337
|
+
return this.#inputOutput.subarray(2, 22) as Bytes20;
|
|
338
|
+
}
|
|
339
|
+
if (this.#inputAddress) {
|
|
340
|
+
return this.#getDecodedAddress()?.data as Bytes20 | undefined;
|
|
341
|
+
}
|
|
342
|
+
const pk = this.#inputPubkey ?? this.pubkey;
|
|
343
|
+
if (pk) {
|
|
344
|
+
return bcrypto.hash160(pk) as Bytes20;
|
|
345
|
+
}
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
#computePubkey(): Uint8Array | undefined {
|
|
350
|
+
if (this.#inputPubkey) {
|
|
351
|
+
return this.#inputPubkey;
|
|
352
|
+
}
|
|
353
|
+
if (this.#inputWitness && this.#inputWitness.length >= 2) {
|
|
354
|
+
return this.#inputWitness[1] as PublicKey;
|
|
355
|
+
}
|
|
356
|
+
return undefined;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
#computeSignature(): Uint8Array | undefined {
|
|
360
|
+
if (this.#inputSignature) {
|
|
361
|
+
return this.#inputSignature;
|
|
362
|
+
}
|
|
363
|
+
if (this.#inputWitness && this.#inputWitness.length >= 1) {
|
|
364
|
+
return this.#inputWitness[0] as Signature;
|
|
365
|
+
}
|
|
366
|
+
return undefined;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
#computeOutput(): Uint8Array | undefined {
|
|
370
|
+
if (this.#inputOutput) {
|
|
371
|
+
return this.#inputOutput;
|
|
372
|
+
}
|
|
373
|
+
const h = this.hash;
|
|
374
|
+
if (!h) return undefined;
|
|
375
|
+
|
|
376
|
+
return bscript.compile([OPS.OP_0, h]) as Script;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
#computeInput(): Uint8Array | undefined {
|
|
380
|
+
if (this.witness) {
|
|
381
|
+
return EMPTY_BUFFER as Script;
|
|
382
|
+
}
|
|
383
|
+
return undefined;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Validation
|
|
387
|
+
|
|
388
|
+
#computeWitness(): Uint8Array[] | undefined {
|
|
389
|
+
if (this.#inputWitness) {
|
|
390
|
+
return this.#inputWitness;
|
|
391
|
+
}
|
|
392
|
+
if (!this.#inputPubkey || !this.#inputSignature) {
|
|
393
|
+
return undefined;
|
|
394
|
+
}
|
|
395
|
+
return [this.#inputSignature, this.#inputPubkey];
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
#validate(): void {
|
|
399
|
+
let hash: Uint8Array = new Uint8Array(0);
|
|
400
|
+
|
|
401
|
+
if (this.#inputAddress) {
|
|
402
|
+
const addr = this.#getDecodedAddress();
|
|
403
|
+
if (!addr) {
|
|
404
|
+
throw new TypeError('Invalid address');
|
|
405
|
+
}
|
|
406
|
+
if (this.#network && this.#network.bech32 !== addr.prefix) {
|
|
100
407
|
throw new TypeError('Invalid prefix or Network mismatch');
|
|
101
|
-
|
|
102
|
-
if (
|
|
103
|
-
|
|
408
|
+
}
|
|
409
|
+
if (addr.version !== 0x00) {
|
|
410
|
+
throw new TypeError('Invalid address version');
|
|
411
|
+
}
|
|
412
|
+
if (addr.data.length !== 20) {
|
|
413
|
+
throw new TypeError('Invalid address data');
|
|
414
|
+
}
|
|
415
|
+
hash = addr.data;
|
|
104
416
|
}
|
|
105
417
|
|
|
106
|
-
if (
|
|
107
|
-
if (hash.length > 0 && !
|
|
108
|
-
|
|
418
|
+
if (this.#inputHash) {
|
|
419
|
+
if (hash.length > 0 && !equals(hash, this.#inputHash)) {
|
|
420
|
+
throw new TypeError('Hash mismatch');
|
|
421
|
+
} else {
|
|
422
|
+
hash = this.#inputHash;
|
|
423
|
+
}
|
|
109
424
|
}
|
|
110
425
|
|
|
111
|
-
if (
|
|
112
|
-
if (
|
|
426
|
+
if (this.#inputOutput) {
|
|
427
|
+
if (
|
|
428
|
+
this.#inputOutput.length !== 22 ||
|
|
429
|
+
this.#inputOutput[0] !== OPS.OP_0 ||
|
|
430
|
+
this.#inputOutput[1] !== 0x14
|
|
431
|
+
) {
|
|
113
432
|
throw new TypeError('Output is invalid');
|
|
114
|
-
|
|
433
|
+
}
|
|
434
|
+
if (hash.length > 0 && !equals(hash, this.#inputOutput.subarray(2))) {
|
|
115
435
|
throw new TypeError('Hash mismatch');
|
|
116
|
-
else
|
|
436
|
+
} else {
|
|
437
|
+
hash = this.#inputOutput.subarray(2);
|
|
438
|
+
}
|
|
117
439
|
}
|
|
118
440
|
|
|
119
|
-
if (
|
|
120
|
-
const pkh = bcrypto.hash160(
|
|
121
|
-
if (hash.length > 0 && !
|
|
122
|
-
|
|
123
|
-
|
|
441
|
+
if (this.#inputPubkey) {
|
|
442
|
+
const pkh = bcrypto.hash160(this.#inputPubkey);
|
|
443
|
+
if (hash.length > 0 && !equals(hash, pkh)) {
|
|
444
|
+
throw new TypeError('Hash mismatch');
|
|
445
|
+
} else {
|
|
446
|
+
hash = pkh;
|
|
447
|
+
}
|
|
448
|
+
if (!isPoint(this.#inputPubkey) || this.#inputPubkey.length !== 33) {
|
|
124
449
|
throw new TypeError('Invalid pubkey for p2wpkh');
|
|
450
|
+
}
|
|
125
451
|
}
|
|
126
452
|
|
|
127
|
-
if (
|
|
128
|
-
if (
|
|
129
|
-
|
|
453
|
+
if (this.#inputWitness) {
|
|
454
|
+
if (this.#inputWitness.length !== 2) {
|
|
455
|
+
throw new TypeError('Witness is invalid');
|
|
456
|
+
}
|
|
457
|
+
if (!bscript.isCanonicalScriptSignature(this.#inputWitness[0]!)) {
|
|
130
458
|
throw new TypeError('Witness has invalid signature');
|
|
131
|
-
|
|
459
|
+
}
|
|
460
|
+
if (!isPoint(this.#inputWitness[1]!) || this.#inputWitness[1]!.length !== 33) {
|
|
132
461
|
throw new TypeError('Witness has invalid pubkey');
|
|
462
|
+
}
|
|
133
463
|
|
|
134
|
-
if (
|
|
464
|
+
if (this.#inputSignature && !equals(this.#inputSignature!, this.#inputWitness[0]!)) {
|
|
135
465
|
throw new TypeError('Signature mismatch');
|
|
136
|
-
|
|
466
|
+
}
|
|
467
|
+
if (this.#inputPubkey && !equals(this.#inputPubkey!, this.#inputWitness[1]!)) {
|
|
468
|
+
throw new TypeError('Pubkey mismatch');
|
|
469
|
+
}
|
|
137
470
|
|
|
138
|
-
const pkh = bcrypto.hash160(
|
|
139
|
-
if (hash.length > 0 && !
|
|
471
|
+
const pkh = bcrypto.hash160(this.#inputWitness[1]);
|
|
472
|
+
if (hash.length > 0 && !equals(hash, pkh)) {
|
|
473
|
+
throw new TypeError('Hash mismatch');
|
|
474
|
+
}
|
|
140
475
|
}
|
|
141
476
|
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Creates a Pay-to-Witness-Public-Key-Hash (P2WPKH) payment object.
|
|
481
|
+
*
|
|
482
|
+
* This is the legacy factory function for backwards compatibility.
|
|
483
|
+
* For new code, prefer using the P2WPKH class directly.
|
|
484
|
+
*
|
|
485
|
+
* @param a - The payment object containing the necessary data
|
|
486
|
+
* @param opts - Optional payment options
|
|
487
|
+
* @returns The P2WPKH payment object
|
|
488
|
+
* @throws {TypeError} If the required data is not provided or if the data is invalid
|
|
489
|
+
*
|
|
490
|
+
* @example
|
|
491
|
+
* ```typescript
|
|
492
|
+
* import { p2wpkh } from '@btc-vision/bitcoin';
|
|
493
|
+
*
|
|
494
|
+
* // Create from public key
|
|
495
|
+
* const payment = p2wpkh({ pubkey });
|
|
496
|
+
*
|
|
497
|
+
* // Create from address
|
|
498
|
+
* const fromAddr = p2wpkh({ address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4' });
|
|
499
|
+
* ```
|
|
500
|
+
*/
|
|
501
|
+
export function p2wpkh(a: Omit<P2WPKHPayment, 'name'>, opts?: PaymentOpts): P2WPKHPayment {
|
|
502
|
+
if (!a.address && !a.hash && !a.output && !a.pubkey && !a.witness) {
|
|
503
|
+
throw new TypeError('Not enough data');
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
const instance = new P2WPKH(
|
|
507
|
+
{
|
|
508
|
+
address: a.address,
|
|
509
|
+
hash: a.hash,
|
|
510
|
+
pubkey: a.pubkey,
|
|
511
|
+
signature: a.signature,
|
|
512
|
+
output: a.output,
|
|
513
|
+
witness: a.witness,
|
|
514
|
+
network: a.network,
|
|
515
|
+
},
|
|
516
|
+
opts,
|
|
517
|
+
);
|
|
142
518
|
|
|
143
|
-
|
|
519
|
+
// Return a merged object for backwards compatibility
|
|
520
|
+
return Object.assign(instance.toPayment(), a);
|
|
144
521
|
}
|