@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
package/src/payments/types.ts
CHANGED
|
@@ -4,133 +4,147 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { Network } from '../networks.js';
|
|
7
|
-
import type {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
7
|
+
import type {
|
|
8
|
+
Bytes20,
|
|
9
|
+
Bytes32,
|
|
10
|
+
PublicKey,
|
|
11
|
+
Script,
|
|
12
|
+
Signature,
|
|
13
|
+
SchnorrSignature,
|
|
14
|
+
Taptree,
|
|
15
|
+
XOnlyPublicKey,
|
|
16
|
+
} from '../types.js';
|
|
17
|
+
|
|
18
|
+
export const PaymentType = {
|
|
19
|
+
P2PK: 'p2pk',
|
|
20
|
+
P2PKH: 'p2pkh',
|
|
21
|
+
P2SH: 'p2sh',
|
|
22
|
+
P2MS: 'p2ms',
|
|
23
|
+
P2WPKH: 'p2wpkh',
|
|
24
|
+
P2WSH: 'p2wsh',
|
|
25
|
+
P2TR: 'p2tr',
|
|
26
|
+
P2OP: 'p2op',
|
|
27
|
+
Embed: 'embed',
|
|
28
|
+
ScriptRedeem: 'scriptRedeem',
|
|
29
|
+
} as const;
|
|
30
|
+
|
|
31
|
+
export type PaymentType = (typeof PaymentType)[keyof typeof PaymentType];
|
|
21
32
|
|
|
22
33
|
export interface BasePayment {
|
|
23
|
-
/** Convenience label, also the discriminant for the union. */
|
|
24
|
-
name?:
|
|
34
|
+
/** Convenience label, also the discriminant for the union. Can be dynamic for nested types. */
|
|
35
|
+
readonly name?: string | undefined;
|
|
25
36
|
/** Network parameters (mainnet if omitted). */
|
|
26
|
-
network?: Network;
|
|
37
|
+
readonly network?: Network | undefined;
|
|
27
38
|
/** Fully-assembled scriptPubKey (if already known). */
|
|
28
|
-
output?:
|
|
39
|
+
readonly output?: Script | undefined;
|
|
29
40
|
/** Raw scriptSig (legacy script types only). */
|
|
30
|
-
input?:
|
|
41
|
+
readonly input?: Script | undefined;
|
|
31
42
|
/** Human-readable address (if already known). */
|
|
32
|
-
address?: string;
|
|
43
|
+
readonly address?: string | undefined;
|
|
33
44
|
/** Segwit stack (empty for legacy). */
|
|
34
|
-
witness?:
|
|
45
|
+
readonly witness?: Uint8Array[] | undefined;
|
|
35
46
|
|
|
36
47
|
/** Script template for P2SH, P2WSH, P2TR, etc. */
|
|
37
|
-
redeem?: ScriptRedeem;
|
|
48
|
+
readonly redeem?: ScriptRedeem | undefined;
|
|
38
49
|
|
|
39
50
|
/** Non-standard options used by some wallets. */
|
|
40
|
-
useHybrid?: boolean;
|
|
41
|
-
useUncompressed?: boolean;
|
|
51
|
+
readonly useHybrid?: boolean | undefined;
|
|
52
|
+
readonly useUncompressed?: boolean | undefined;
|
|
42
53
|
}
|
|
43
54
|
|
|
44
55
|
/** Helper used by redeeming script-template outputs (P2SH, P2WSH). */
|
|
45
56
|
export interface ScriptRedeem extends BasePayment {
|
|
46
|
-
output?:
|
|
47
|
-
redeemVersion?: number; // tapscript leaves etc.
|
|
48
|
-
network?: Network; // network parameters (mainnet if omitted)
|
|
57
|
+
readonly output?: Script | undefined; // script template
|
|
58
|
+
readonly redeemVersion?: number | undefined; // tapscript leaves etc.
|
|
59
|
+
readonly network?: Network | undefined; // network parameters (mainnet if omitted)
|
|
49
60
|
}
|
|
50
61
|
|
|
51
62
|
export interface P2PKPayment extends BasePayment {
|
|
52
|
-
name: PaymentType.P2PK;
|
|
53
|
-
pubkey?:
|
|
63
|
+
readonly name: typeof PaymentType.P2PK;
|
|
64
|
+
readonly pubkey?: PublicKey | undefined;
|
|
54
65
|
/** DER-encoded sig – empty until signed. */
|
|
55
|
-
signature?:
|
|
66
|
+
readonly signature?: Signature | undefined;
|
|
56
67
|
}
|
|
57
68
|
|
|
58
69
|
export interface P2PKHPayment extends BasePayment {
|
|
59
|
-
name: PaymentType.P2PKH;
|
|
70
|
+
readonly name: typeof PaymentType.P2PKH;
|
|
60
71
|
/** RIPEMD-160(SHA-256(pubkey)) – 20 bytes. */
|
|
61
|
-
hash?:
|
|
62
|
-
pubkey?:
|
|
63
|
-
signature?:
|
|
72
|
+
readonly hash?: Bytes20 | undefined;
|
|
73
|
+
readonly pubkey?: PublicKey | undefined;
|
|
74
|
+
readonly signature?: Signature | undefined;
|
|
64
75
|
}
|
|
65
76
|
|
|
66
77
|
export interface P2SHPayment extends BasePayment {
|
|
67
|
-
name
|
|
78
|
+
/** Dynamic name like 'p2sh' or 'p2sh-p2wpkh' for nested types */
|
|
79
|
+
readonly name: string;
|
|
68
80
|
/** Hash160 of a redeem script. */
|
|
69
|
-
hash?:
|
|
81
|
+
readonly hash?: Bytes20 | undefined;
|
|
70
82
|
|
|
71
83
|
/** The entire signature stack when spending a P2SH (non-segwit). */
|
|
72
|
-
signatures?:
|
|
84
|
+
readonly signatures?: Uint8Array[] | undefined;
|
|
73
85
|
}
|
|
74
86
|
|
|
75
87
|
export interface P2MSPayment extends BasePayment {
|
|
76
|
-
name
|
|
88
|
+
/** Dynamic name like 'p2ms' or 'p2ms(2 of 3)' with M-of-N parameters */
|
|
89
|
+
readonly name: string;
|
|
77
90
|
/** M-of-N parameters. */
|
|
78
|
-
m?: number;
|
|
79
|
-
n?: number;
|
|
80
|
-
pubkeys?:
|
|
81
|
-
signatures?:
|
|
91
|
+
readonly m?: number | undefined;
|
|
92
|
+
readonly n?: number | undefined;
|
|
93
|
+
readonly pubkeys?: PublicKey[] | undefined;
|
|
94
|
+
readonly signatures?: Signature[] | undefined;
|
|
82
95
|
}
|
|
83
96
|
|
|
84
97
|
export interface P2WPKHPayment extends BasePayment {
|
|
85
|
-
name: PaymentType.P2WPKH;
|
|
98
|
+
readonly name: typeof PaymentType.P2WPKH;
|
|
86
99
|
/** 20-byte witness program. */
|
|
87
|
-
hash?:
|
|
88
|
-
pubkey?:
|
|
89
|
-
signature?:
|
|
100
|
+
readonly hash?: Bytes20 | undefined;
|
|
101
|
+
readonly pubkey?: PublicKey | undefined;
|
|
102
|
+
readonly signature?: Signature | undefined;
|
|
90
103
|
}
|
|
91
104
|
|
|
92
105
|
export interface P2WSHPayment extends BasePayment {
|
|
93
|
-
name
|
|
106
|
+
/** Dynamic name like 'p2wsh' or 'p2wsh-p2pk' for nested types */
|
|
107
|
+
readonly name: string;
|
|
94
108
|
/** 32-byte witness program. */
|
|
95
|
-
hash?:
|
|
96
|
-
redeem?: ScriptRedeem;
|
|
109
|
+
readonly hash?: Bytes32 | undefined;
|
|
110
|
+
readonly redeem?: ScriptRedeem | undefined;
|
|
97
111
|
}
|
|
98
112
|
|
|
99
113
|
export interface P2TRPayment extends BasePayment {
|
|
100
|
-
name: PaymentType.P2TR;
|
|
114
|
+
readonly name: typeof PaymentType.P2TR;
|
|
101
115
|
/** x-only pubkey that commits to the tree. */
|
|
102
|
-
pubkey?:
|
|
116
|
+
readonly pubkey?: XOnlyPublicKey | undefined;
|
|
103
117
|
/** Internal (untweaked) x-only pubkey. */
|
|
104
|
-
internalPubkey?:
|
|
118
|
+
readonly internalPubkey?: XOnlyPublicKey | undefined;
|
|
105
119
|
/** Merkle-root tweak, present when a script path exists. */
|
|
106
|
-
hash?:
|
|
120
|
+
readonly hash?: Bytes32 | undefined;
|
|
107
121
|
/** Full taptree description (optional, dev-side). */
|
|
108
|
-
scriptTree?: Taptree;
|
|
122
|
+
readonly scriptTree?: Taptree | undefined;
|
|
109
123
|
/** Key-path sig or leading stack elem. */
|
|
110
|
-
signature?:
|
|
124
|
+
readonly signature?: SchnorrSignature | undefined;
|
|
111
125
|
|
|
112
|
-
redeemVersion?: number; // tapscript leaves etc.
|
|
113
|
-
redeem?: ScriptRedeem;
|
|
126
|
+
readonly redeemVersion?: number | undefined; // tapscript leaves etc.
|
|
127
|
+
readonly redeem?: ScriptRedeem | undefined;
|
|
114
128
|
}
|
|
115
129
|
|
|
116
130
|
export interface P2OPPayment extends BasePayment {
|
|
117
|
-
name: PaymentType.P2OP;
|
|
131
|
+
readonly name: typeof PaymentType.P2OP;
|
|
118
132
|
/** <deploymentVersion || HASH160(payload)> (2–40 bytes). */
|
|
119
|
-
program?:
|
|
120
|
-
deploymentVersion
|
|
133
|
+
readonly program?: Uint8Array | undefined;
|
|
134
|
+
readonly deploymentVersion?: number | undefined;
|
|
121
135
|
/** Convenience slice of `program` (20 bytes for current spec). */
|
|
122
|
-
hash160?:
|
|
136
|
+
readonly hash160?: Bytes20 | undefined;
|
|
123
137
|
}
|
|
124
138
|
|
|
125
139
|
export interface P2OPPaymentParams extends Omit<P2OPPayment, 'name' | 'deploymentVersion'> {
|
|
126
|
-
deploymentVersion?: number;
|
|
140
|
+
readonly deploymentVersion?: number | undefined;
|
|
127
141
|
}
|
|
128
142
|
|
|
129
143
|
/** OP_RETURN data-carrying output */
|
|
130
144
|
export interface EmbedPayment extends BasePayment {
|
|
131
|
-
name: PaymentType.Embed;
|
|
145
|
+
readonly name: typeof PaymentType.Embed;
|
|
132
146
|
/** Raw pushed chunks after OP_RETURN. */
|
|
133
|
-
data:
|
|
147
|
+
readonly data: Uint8Array[];
|
|
134
148
|
// `output` is automatically derived from `data` (or vice-versa)
|
|
135
149
|
}
|
|
136
150
|
|
|
@@ -149,6 +163,6 @@ export type Payment =
|
|
|
149
163
|
export type PaymentCreator = <T extends BasePayment>(a: T, opts?: PaymentOpts) => T;
|
|
150
164
|
|
|
151
165
|
export interface PaymentOpts {
|
|
152
|
-
validate?: boolean;
|
|
153
|
-
allowIncomplete?: boolean;
|
|
166
|
+
readonly validate?: boolean;
|
|
167
|
+
readonly allowIncomplete?: boolean;
|
|
154
168
|
}
|
package/src/psbt/bip371.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
2
|
PsbtInput,
|
|
3
3
|
PsbtOutput,
|
|
4
4
|
TapInternalKey,
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
TapLeafScript,
|
|
7
7
|
TapScriptSig,
|
|
8
8
|
TapTree,
|
|
9
|
-
} from 'bip174
|
|
9
|
+
} from 'bip174';
|
|
10
10
|
import {
|
|
11
11
|
LEAF_VERSION_TAPSCRIPT,
|
|
12
12
|
MAX_TAPTREE_DEPTH,
|
|
@@ -15,9 +15,10 @@ import {
|
|
|
15
15
|
tweakKey,
|
|
16
16
|
} from '../payments/bip341.js';
|
|
17
17
|
import { p2tr } from '../payments/p2tr.js';
|
|
18
|
-
import { toXOnly } from '../pubkey.js';
|
|
19
18
|
import { Transaction } from '../transaction.js';
|
|
20
|
-
import { isTapleaf, isTaptree
|
|
19
|
+
import { isTapleaf, isTaptree } from '../types.js';
|
|
20
|
+
import type { Tapleaf, Taptree, XOnlyPublicKey, Bytes32 } from '../types.js';
|
|
21
|
+
import { concat, equals } from '../io/index.js';
|
|
21
22
|
import {
|
|
22
23
|
isP2TR,
|
|
23
24
|
pubkeyPositionInScript,
|
|
@@ -26,7 +27,7 @@ import {
|
|
|
26
27
|
} from './psbtutils.js';
|
|
27
28
|
|
|
28
29
|
interface PsbtOutputWithScript extends PsbtOutput {
|
|
29
|
-
script?:
|
|
30
|
+
script?: Uint8Array;
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
/**
|
|
@@ -41,25 +42,27 @@ interface PsbtOutputWithScript extends PsbtOutput {
|
|
|
41
42
|
export function tapScriptFinalizer(
|
|
42
43
|
inputIndex: number,
|
|
43
44
|
input: PsbtInput,
|
|
44
|
-
tapLeafHashToFinalize?:
|
|
45
|
+
tapLeafHashToFinalize?: Uint8Array,
|
|
45
46
|
): {
|
|
46
|
-
finalScriptWitness:
|
|
47
|
+
finalScriptWitness: Uint8Array | undefined;
|
|
47
48
|
} {
|
|
48
49
|
const tapLeaf = findTapLeafToFinalize(input, inputIndex, tapLeafHashToFinalize);
|
|
49
50
|
|
|
50
51
|
try {
|
|
51
52
|
const sigs = sortSignatures(input, tapLeaf);
|
|
52
|
-
const witness = sigs
|
|
53
|
+
const witness = sigs
|
|
54
|
+
.concat(new Uint8Array(tapLeaf.script))
|
|
55
|
+
.concat(new Uint8Array(tapLeaf.controlBlock));
|
|
53
56
|
return { finalScriptWitness: witnessStackToScriptWitness(witness) };
|
|
54
57
|
} catch (err) {
|
|
55
58
|
throw new Error(`Can not finalize taproot input #${inputIndex}: ${err}`);
|
|
56
59
|
}
|
|
57
60
|
}
|
|
58
61
|
|
|
59
|
-
export function serializeTaprootSignature(sig:
|
|
60
|
-
const sighashTypeByte = sighashType ?
|
|
62
|
+
export function serializeTaprootSignature(sig: Uint8Array, sighashType?: number): Uint8Array {
|
|
63
|
+
const sighashTypeByte = sighashType ? new Uint8Array([sighashType]) : new Uint8Array(0);
|
|
61
64
|
|
|
62
|
-
return
|
|
65
|
+
return concat([sig, sighashTypeByte]);
|
|
63
66
|
}
|
|
64
67
|
|
|
65
68
|
export function isTaprootInput(input: PsbtInput): boolean {
|
|
@@ -70,12 +73,12 @@ export function isTaprootInput(input: PsbtInput): boolean {
|
|
|
70
73
|
input.tapMerkleRoot ||
|
|
71
74
|
(input.tapLeafScript && input.tapLeafScript.length) ||
|
|
72
75
|
(input.tapBip32Derivation && input.tapBip32Derivation.length) ||
|
|
73
|
-
(input.witnessUtxo && isP2TR(input.witnessUtxo.script))
|
|
76
|
+
(input.witnessUtxo && isP2TR(new Uint8Array(input.witnessUtxo.script)))
|
|
74
77
|
)
|
|
75
78
|
);
|
|
76
79
|
}
|
|
77
80
|
|
|
78
|
-
export function isTaprootOutput(output: PsbtOutput, script?:
|
|
81
|
+
export function isTaprootOutput(output: PsbtOutput, script?: Uint8Array): boolean {
|
|
79
82
|
return (
|
|
80
83
|
output &&
|
|
81
84
|
!!(
|
|
@@ -117,29 +120,34 @@ function checkTaprootScriptPubkey(
|
|
|
117
120
|
if (tapInternalKey) {
|
|
118
121
|
const scriptPubkey = outputData.script;
|
|
119
122
|
const script = getTaprootScripPubkey(tapInternalKey, tapTree);
|
|
120
|
-
if (scriptPubkey && !
|
|
123
|
+
if (scriptPubkey && !equals(scriptPubkey, script))
|
|
121
124
|
throw new Error('Error adding output. Script or address missmatch.');
|
|
122
125
|
}
|
|
123
126
|
}
|
|
124
127
|
|
|
125
|
-
function getTaprootScripPubkey(tapInternalKey: TapInternalKey, tapTree?: TapTree):
|
|
128
|
+
function getTaprootScripPubkey(tapInternalKey: TapInternalKey, tapTree?: TapTree): Uint8Array {
|
|
126
129
|
const scriptTree = tapTree && tapTreeFromList(tapTree.leaves);
|
|
127
130
|
const { output } = p2tr({
|
|
128
|
-
internalPubkey: tapInternalKey,
|
|
131
|
+
internalPubkey: new Uint8Array(tapInternalKey) as XOnlyPublicKey,
|
|
129
132
|
scriptTree,
|
|
130
133
|
});
|
|
131
134
|
if (!output) throw new Error('Failed to generate taproot script pubkey');
|
|
132
135
|
return output;
|
|
133
136
|
}
|
|
134
137
|
|
|
135
|
-
export function tweakInternalPubKey(inputIndex: number, input: PsbtInput):
|
|
138
|
+
export function tweakInternalPubKey(inputIndex: number, input: PsbtInput): Uint8Array {
|
|
136
139
|
const tapInternalKey = input.tapInternalKey;
|
|
137
|
-
const
|
|
140
|
+
const tapInternalKeyBuf = tapInternalKey ? new Uint8Array(tapInternalKey) as XOnlyPublicKey : undefined;
|
|
141
|
+
const tapMerkleRootBuf = input.tapMerkleRoot ? new Uint8Array(input.tapMerkleRoot) as Bytes32 : undefined;
|
|
142
|
+
const outputKey = tapInternalKeyBuf && tweakKey(tapInternalKeyBuf, tapMerkleRootBuf);
|
|
138
143
|
|
|
139
144
|
if (!outputKey)
|
|
140
145
|
throw new Error(
|
|
141
146
|
`Cannot tweak tap internal key for input #${inputIndex}. Public key: ${
|
|
142
|
-
|
|
147
|
+
tapInternalKeyBuf &&
|
|
148
|
+
Array.from(tapInternalKeyBuf)
|
|
149
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
150
|
+
.join('')
|
|
143
151
|
}`,
|
|
144
152
|
);
|
|
145
153
|
return outputKey.x;
|
|
@@ -168,10 +176,10 @@ export function tapTreeToList(tree: Taptree): TapLeaf[] {
|
|
|
168
176
|
* @returns the corresponding taptree, or throws an exception if the tree cannot be reconstructed
|
|
169
177
|
*/
|
|
170
178
|
export function tapTreeFromList(leaves: TapLeaf[] = []): Taptree {
|
|
171
|
-
if (leaves.length === 1 && leaves[0]
|
|
179
|
+
if (leaves.length === 1 && leaves[0]!.depth === 0)
|
|
172
180
|
return {
|
|
173
|
-
output: leaves[0]
|
|
174
|
-
version: leaves[0]
|
|
181
|
+
output: new Uint8Array(leaves[0]!.script),
|
|
182
|
+
version: leaves[0]!.leafVersion,
|
|
175
183
|
};
|
|
176
184
|
|
|
177
185
|
return insertLeavesInTree(leaves);
|
|
@@ -182,8 +190,8 @@ export function checkTaprootInputForSigs(input: PsbtInput, action: string): bool
|
|
|
182
190
|
return sigs.some((sig) => signatureBlocksAction(sig, decodeSchnorrSignature, action));
|
|
183
191
|
}
|
|
184
192
|
|
|
185
|
-
function decodeSchnorrSignature(signature:
|
|
186
|
-
signature:
|
|
193
|
+
function decodeSchnorrSignature(signature: Uint8Array): {
|
|
194
|
+
signature: Uint8Array;
|
|
187
195
|
hashType: number;
|
|
188
196
|
} {
|
|
189
197
|
return {
|
|
@@ -192,23 +200,27 @@ function decodeSchnorrSignature(signature: Buffer): {
|
|
|
192
200
|
};
|
|
193
201
|
}
|
|
194
202
|
|
|
195
|
-
function extractTaprootSigs(input: PsbtInput):
|
|
196
|
-
const sigs:
|
|
197
|
-
if (input.tapKeySig) sigs.push(input.tapKeySig);
|
|
198
|
-
if (input.tapScriptSig)
|
|
203
|
+
function extractTaprootSigs(input: PsbtInput): Uint8Array[] {
|
|
204
|
+
const sigs: Uint8Array[] = [];
|
|
205
|
+
if (input.tapKeySig) sigs.push(new Uint8Array(input.tapKeySig));
|
|
206
|
+
if (input.tapScriptSig)
|
|
207
|
+
sigs.push(...input.tapScriptSig.map((s) => new Uint8Array(s.signature)));
|
|
199
208
|
if (!sigs.length) {
|
|
200
|
-
const finalTapKeySig = getTapKeySigFromWitness(
|
|
209
|
+
const finalTapKeySig = getTapKeySigFromWitness(
|
|
210
|
+
input.finalScriptWitness ? new Uint8Array(input.finalScriptWitness) : undefined,
|
|
211
|
+
);
|
|
201
212
|
if (finalTapKeySig) sigs.push(finalTapKeySig);
|
|
202
213
|
}
|
|
203
214
|
|
|
204
215
|
return sigs;
|
|
205
216
|
}
|
|
206
217
|
|
|
207
|
-
export function getTapKeySigFromWitness(finalScriptWitness?:
|
|
218
|
+
export function getTapKeySigFromWitness(finalScriptWitness?: Uint8Array): Uint8Array | undefined {
|
|
208
219
|
if (!finalScriptWitness) return;
|
|
209
220
|
const witness = finalScriptWitness.subarray(2);
|
|
210
221
|
// todo: add schnorr signature validation
|
|
211
222
|
if (witness.length === 64 || witness.length === 65) return witness;
|
|
223
|
+
return undefined;
|
|
212
224
|
}
|
|
213
225
|
|
|
214
226
|
function _tapTreeToList(tree: Taptree, leaves: TapLeaf[] = [], depth = 0): TapLeaf[] {
|
|
@@ -245,7 +257,7 @@ function insertLeafInTree(leaf: TapLeaf, tree?: PartialTaptree, depth = 0): Part
|
|
|
245
257
|
if (leaf.depth === depth) {
|
|
246
258
|
if (!tree)
|
|
247
259
|
return {
|
|
248
|
-
output: leaf.script,
|
|
260
|
+
output: new Uint8Array(leaf.script),
|
|
249
261
|
version: leaf.leafVersion,
|
|
250
262
|
};
|
|
251
263
|
return;
|
|
@@ -257,6 +269,7 @@ function insertLeafInTree(leaf: TapLeaf, tree?: PartialTaptree, depth = 0): Part
|
|
|
257
269
|
|
|
258
270
|
const rightSide = insertLeafInTree(leaf, tree && tree[1], depth + 1);
|
|
259
271
|
if (rightSide) return [tree && tree[0], rightSide];
|
|
272
|
+
return undefined;
|
|
260
273
|
}
|
|
261
274
|
|
|
262
275
|
function checkMixedTaprootAndNonTaprootInputFields(
|
|
@@ -307,17 +320,19 @@ function checkMixedTaprootAndNonTaprootOutputFields(
|
|
|
307
320
|
*/
|
|
308
321
|
function checkIfTapLeafInTree(inputData: PsbtInput, newInputData: PsbtInput, action: string): void {
|
|
309
322
|
if (newInputData.tapMerkleRoot) {
|
|
323
|
+
const merkleRoot = new Uint8Array(newInputData.tapMerkleRoot);
|
|
310
324
|
const newLeafsInTree = (newInputData.tapLeafScript || []).every((l) =>
|
|
311
|
-
isTapLeafInTree(l,
|
|
325
|
+
isTapLeafInTree(l, merkleRoot),
|
|
312
326
|
);
|
|
313
327
|
const oldLeafsInTree = (inputData.tapLeafScript || []).every((l) =>
|
|
314
|
-
isTapLeafInTree(l,
|
|
328
|
+
isTapLeafInTree(l, merkleRoot),
|
|
315
329
|
);
|
|
316
330
|
if (!newLeafsInTree || !oldLeafsInTree)
|
|
317
331
|
throw new Error(`Invalid arguments for Psbt.${action}. Tapleaf not part of taptree.`);
|
|
318
332
|
} else if (inputData.tapMerkleRoot) {
|
|
333
|
+
const merkleRoot = new Uint8Array(inputData.tapMerkleRoot);
|
|
319
334
|
const newLeafsInTree = (newInputData.tapLeafScript || []).every((l) =>
|
|
320
|
-
isTapLeafInTree(l,
|
|
335
|
+
isTapLeafInTree(l, merkleRoot),
|
|
321
336
|
);
|
|
322
337
|
if (!newLeafsInTree)
|
|
323
338
|
throw new Error(`Invalid arguments for Psbt.${action}. Tapleaf not part of taptree.`);
|
|
@@ -330,16 +345,16 @@ function checkIfTapLeafInTree(inputData: PsbtInput, newInputData: PsbtInput, act
|
|
|
330
345
|
* @param merkleRoot The Merkle root of the tree. If not provided, the function assumes the TapLeafScript is present.
|
|
331
346
|
* @returns A boolean indicating whether the TapLeafScript is present in the tree.
|
|
332
347
|
*/
|
|
333
|
-
function isTapLeafInTree(tapLeaf: TapLeafScript, merkleRoot?:
|
|
348
|
+
function isTapLeafInTree(tapLeaf: TapLeafScript, merkleRoot?: Uint8Array): boolean {
|
|
334
349
|
if (!merkleRoot) return true;
|
|
335
350
|
|
|
336
351
|
const leafHash = tapleafHash({
|
|
337
|
-
output: tapLeaf.script,
|
|
352
|
+
output: new Uint8Array(tapLeaf.script),
|
|
338
353
|
version: tapLeaf.leafVersion,
|
|
339
354
|
});
|
|
340
355
|
|
|
341
|
-
const rootHash = rootHashFromPath(tapLeaf.controlBlock, leafHash);
|
|
342
|
-
return
|
|
356
|
+
const rootHash = rootHashFromPath(new Uint8Array(tapLeaf.controlBlock), leafHash);
|
|
357
|
+
return equals(rootHash, merkleRoot);
|
|
343
358
|
}
|
|
344
359
|
|
|
345
360
|
/**
|
|
@@ -347,19 +362,20 @@ function isTapLeafInTree(tapLeaf: TapLeafScript, merkleRoot?: Buffer): boolean {
|
|
|
347
362
|
*
|
|
348
363
|
* @param input - The PsbtInput object.
|
|
349
364
|
* @param tapLeaf - The TapLeafScript object.
|
|
350
|
-
* @returns An array of sorted signatures as
|
|
365
|
+
* @returns An array of sorted signatures as Uint8Arrays.
|
|
351
366
|
*/
|
|
352
|
-
function sortSignatures(input: PsbtInput, tapLeaf: TapLeafScript):
|
|
367
|
+
function sortSignatures(input: PsbtInput, tapLeaf: TapLeafScript): Uint8Array[] {
|
|
368
|
+
const tapLeafScript = new Uint8Array(tapLeaf.script);
|
|
353
369
|
const leafHash = tapleafHash({
|
|
354
|
-
output:
|
|
370
|
+
output: tapLeafScript,
|
|
355
371
|
version: tapLeaf.leafVersion,
|
|
356
372
|
});
|
|
357
373
|
|
|
358
374
|
return (input.tapScriptSig || [])
|
|
359
|
-
.filter((tss) => tss.leafHash
|
|
360
|
-
.map((tss) => addPubkeyPositionInScript(
|
|
375
|
+
.filter((tss) => equals(new Uint8Array(tss.leafHash), leafHash))
|
|
376
|
+
.map((tss) => addPubkeyPositionInScript(tapLeafScript, tss))
|
|
361
377
|
.sort((t1, t2) => t2.positionInScript - t1.positionInScript)
|
|
362
|
-
.map((t) => t.signature);
|
|
378
|
+
.map((t) => new Uint8Array(t.signature));
|
|
363
379
|
}
|
|
364
380
|
|
|
365
381
|
/**
|
|
@@ -368,10 +384,10 @@ function sortSignatures(input: PsbtInput, tapLeaf: TapLeafScript): Buffer[] {
|
|
|
368
384
|
* @param tss The TapScriptSig object to add the position to.
|
|
369
385
|
* @returns A TapScriptSigWitPosition object with the added position.
|
|
370
386
|
*/
|
|
371
|
-
function addPubkeyPositionInScript(script:
|
|
387
|
+
function addPubkeyPositionInScript(script: Uint8Array, tss: TapScriptSig): TapScriptSigWitPosition {
|
|
372
388
|
return Object.assign(
|
|
373
389
|
{
|
|
374
|
-
positionInScript: pubkeyPositionInScript(tss.pubkey, script),
|
|
390
|
+
positionInScript: pubkeyPositionInScript(new Uint8Array(tss.pubkey), script),
|
|
375
391
|
},
|
|
376
392
|
tss,
|
|
377
393
|
) as TapScriptSigWitPosition;
|
|
@@ -383,7 +399,7 @@ function addPubkeyPositionInScript(script: Buffer, tss: TapScriptSig): TapScript
|
|
|
383
399
|
function findTapLeafToFinalize(
|
|
384
400
|
input: PsbtInput,
|
|
385
401
|
inputIndex: number,
|
|
386
|
-
leafHashToFinalize?:
|
|
402
|
+
leafHashToFinalize?: Uint8Array,
|
|
387
403
|
): TapLeafScript {
|
|
388
404
|
const { tapScriptSig } = input;
|
|
389
405
|
if (!tapScriptSig || !tapScriptSig.length)
|
|
@@ -413,15 +429,16 @@ function findTapLeafToFinalize(
|
|
|
413
429
|
function canFinalizeLeaf(
|
|
414
430
|
leaf: TapLeafScript,
|
|
415
431
|
tapScriptSig: TapScriptSig[],
|
|
416
|
-
hash?:
|
|
432
|
+
hash?: Uint8Array,
|
|
417
433
|
): boolean {
|
|
418
434
|
const leafHash = tapleafHash({
|
|
419
|
-
output: leaf.script,
|
|
435
|
+
output: new Uint8Array(leaf.script),
|
|
420
436
|
version: leaf.leafVersion,
|
|
421
437
|
});
|
|
422
|
-
const whiteListedHash = !hash ||
|
|
438
|
+
const whiteListedHash = !hash || equals(hash, leafHash);
|
|
423
439
|
return (
|
|
424
|
-
whiteListedHash &&
|
|
440
|
+
whiteListedHash &&
|
|
441
|
+
tapScriptSig.find((tss) => equals(new Uint8Array(tss.leafHash), leafHash)) !== undefined
|
|
425
442
|
);
|
|
426
443
|
}
|
|
427
444
|
|