@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/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
|
+
SchnorrSignature,
|
|
12
|
+
Script,
|
|
13
|
+
Signature,
|
|
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 {
|
|
19
|
+
import type { Bytes32, Tapleaf, Taptree, XOnlyPublicKey } from '../types.js';
|
|
20
|
+
import { isTapleaf, isTaptree } 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,38 @@ 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
|
|
141
|
+
? (new Uint8Array(tapInternalKey) as XOnlyPublicKey)
|
|
142
|
+
: undefined;
|
|
143
|
+
const tapMerkleRootBuf = input.tapMerkleRoot
|
|
144
|
+
? (new Uint8Array(input.tapMerkleRoot) as Bytes32)
|
|
145
|
+
: undefined;
|
|
146
|
+
const outputKey = tapInternalKeyBuf && tweakKey(tapInternalKeyBuf, tapMerkleRootBuf);
|
|
138
147
|
|
|
139
148
|
if (!outputKey)
|
|
140
149
|
throw new Error(
|
|
141
150
|
`Cannot tweak tap internal key for input #${inputIndex}. Public key: ${
|
|
142
|
-
|
|
151
|
+
tapInternalKeyBuf &&
|
|
152
|
+
Array.from(tapInternalKeyBuf)
|
|
153
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
154
|
+
.join('')
|
|
143
155
|
}`,
|
|
144
156
|
);
|
|
145
157
|
return outputKey.x;
|
|
@@ -168,10 +180,10 @@ export function tapTreeToList(tree: Taptree): TapLeaf[] {
|
|
|
168
180
|
* @returns the corresponding taptree, or throws an exception if the tree cannot be reconstructed
|
|
169
181
|
*/
|
|
170
182
|
export function tapTreeFromList(leaves: TapLeaf[] = []): Taptree {
|
|
171
|
-
if (leaves.length === 1 && leaves[0]
|
|
183
|
+
if (leaves.length === 1 && leaves[0]!.depth === 0)
|
|
172
184
|
return {
|
|
173
|
-
output: leaves[0]
|
|
174
|
-
version: leaves[0]
|
|
185
|
+
output: new Uint8Array(leaves[0]!.script),
|
|
186
|
+
version: leaves[0]!.leafVersion,
|
|
175
187
|
};
|
|
176
188
|
|
|
177
189
|
return insertLeavesInTree(leaves);
|
|
@@ -182,8 +194,8 @@ export function checkTaprootInputForSigs(input: PsbtInput, action: string): bool
|
|
|
182
194
|
return sigs.some((sig) => signatureBlocksAction(sig, decodeSchnorrSignature, action));
|
|
183
195
|
}
|
|
184
196
|
|
|
185
|
-
function decodeSchnorrSignature(signature:
|
|
186
|
-
signature:
|
|
197
|
+
function decodeSchnorrSignature(signature: Uint8Array): {
|
|
198
|
+
signature: Uint8Array;
|
|
187
199
|
hashType: number;
|
|
188
200
|
} {
|
|
189
201
|
return {
|
|
@@ -192,23 +204,27 @@ function decodeSchnorrSignature(signature: Buffer): {
|
|
|
192
204
|
};
|
|
193
205
|
}
|
|
194
206
|
|
|
195
|
-
function extractTaprootSigs(input: PsbtInput):
|
|
196
|
-
const sigs:
|
|
197
|
-
if (input.tapKeySig) sigs.push(input.tapKeySig);
|
|
198
|
-
if (input.tapScriptSig)
|
|
207
|
+
function extractTaprootSigs(input: PsbtInput): Uint8Array[] {
|
|
208
|
+
const sigs: Uint8Array[] = [];
|
|
209
|
+
if (input.tapKeySig) sigs.push(new Uint8Array(input.tapKeySig));
|
|
210
|
+
if (input.tapScriptSig)
|
|
211
|
+
sigs.push(...input.tapScriptSig.map((s) => new Uint8Array(s.signature)));
|
|
199
212
|
if (!sigs.length) {
|
|
200
|
-
const finalTapKeySig = getTapKeySigFromWitness(
|
|
213
|
+
const finalTapKeySig = getTapKeySigFromWitness(
|
|
214
|
+
input.finalScriptWitness ? new Uint8Array(input.finalScriptWitness) : undefined,
|
|
215
|
+
);
|
|
201
216
|
if (finalTapKeySig) sigs.push(finalTapKeySig);
|
|
202
217
|
}
|
|
203
218
|
|
|
204
219
|
return sigs;
|
|
205
220
|
}
|
|
206
221
|
|
|
207
|
-
export function getTapKeySigFromWitness(finalScriptWitness?:
|
|
222
|
+
export function getTapKeySigFromWitness(finalScriptWitness?: Uint8Array): Uint8Array | undefined {
|
|
208
223
|
if (!finalScriptWitness) return;
|
|
209
224
|
const witness = finalScriptWitness.subarray(2);
|
|
210
225
|
// todo: add schnorr signature validation
|
|
211
226
|
if (witness.length === 64 || witness.length === 65) return witness;
|
|
227
|
+
return undefined;
|
|
212
228
|
}
|
|
213
229
|
|
|
214
230
|
function _tapTreeToList(tree: Taptree, leaves: TapLeaf[] = [], depth = 0): TapLeaf[] {
|
|
@@ -245,7 +261,7 @@ function insertLeafInTree(leaf: TapLeaf, tree?: PartialTaptree, depth = 0): Part
|
|
|
245
261
|
if (leaf.depth === depth) {
|
|
246
262
|
if (!tree)
|
|
247
263
|
return {
|
|
248
|
-
output: leaf.script,
|
|
264
|
+
output: new Uint8Array(leaf.script),
|
|
249
265
|
version: leaf.leafVersion,
|
|
250
266
|
};
|
|
251
267
|
return;
|
|
@@ -257,6 +273,7 @@ function insertLeafInTree(leaf: TapLeaf, tree?: PartialTaptree, depth = 0): Part
|
|
|
257
273
|
|
|
258
274
|
const rightSide = insertLeafInTree(leaf, tree && tree[1], depth + 1);
|
|
259
275
|
if (rightSide) return [tree && tree[0], rightSide];
|
|
276
|
+
return undefined;
|
|
260
277
|
}
|
|
261
278
|
|
|
262
279
|
function checkMixedTaprootAndNonTaprootInputFields(
|
|
@@ -307,17 +324,19 @@ function checkMixedTaprootAndNonTaprootOutputFields(
|
|
|
307
324
|
*/
|
|
308
325
|
function checkIfTapLeafInTree(inputData: PsbtInput, newInputData: PsbtInput, action: string): void {
|
|
309
326
|
if (newInputData.tapMerkleRoot) {
|
|
327
|
+
const merkleRoot = new Uint8Array(newInputData.tapMerkleRoot);
|
|
310
328
|
const newLeafsInTree = (newInputData.tapLeafScript || []).every((l) =>
|
|
311
|
-
isTapLeafInTree(l,
|
|
329
|
+
isTapLeafInTree(l, merkleRoot),
|
|
312
330
|
);
|
|
313
331
|
const oldLeafsInTree = (inputData.tapLeafScript || []).every((l) =>
|
|
314
|
-
isTapLeafInTree(l,
|
|
332
|
+
isTapLeafInTree(l, merkleRoot),
|
|
315
333
|
);
|
|
316
334
|
if (!newLeafsInTree || !oldLeafsInTree)
|
|
317
335
|
throw new Error(`Invalid arguments for Psbt.${action}. Tapleaf not part of taptree.`);
|
|
318
336
|
} else if (inputData.tapMerkleRoot) {
|
|
337
|
+
const merkleRoot = new Uint8Array(inputData.tapMerkleRoot);
|
|
319
338
|
const newLeafsInTree = (newInputData.tapLeafScript || []).every((l) =>
|
|
320
|
-
isTapLeafInTree(l,
|
|
339
|
+
isTapLeafInTree(l, merkleRoot),
|
|
321
340
|
);
|
|
322
341
|
if (!newLeafsInTree)
|
|
323
342
|
throw new Error(`Invalid arguments for Psbt.${action}. Tapleaf not part of taptree.`);
|
|
@@ -330,16 +349,16 @@ function checkIfTapLeafInTree(inputData: PsbtInput, newInputData: PsbtInput, act
|
|
|
330
349
|
* @param merkleRoot The Merkle root of the tree. If not provided, the function assumes the TapLeafScript is present.
|
|
331
350
|
* @returns A boolean indicating whether the TapLeafScript is present in the tree.
|
|
332
351
|
*/
|
|
333
|
-
function isTapLeafInTree(tapLeaf: TapLeafScript, merkleRoot?:
|
|
352
|
+
function isTapLeafInTree(tapLeaf: TapLeafScript, merkleRoot?: Uint8Array): boolean {
|
|
334
353
|
if (!merkleRoot) return true;
|
|
335
354
|
|
|
336
355
|
const leafHash = tapleafHash({
|
|
337
|
-
output: tapLeaf.script,
|
|
356
|
+
output: new Uint8Array(tapLeaf.script),
|
|
338
357
|
version: tapLeaf.leafVersion,
|
|
339
358
|
});
|
|
340
359
|
|
|
341
|
-
const rootHash = rootHashFromPath(tapLeaf.controlBlock, leafHash);
|
|
342
|
-
return
|
|
360
|
+
const rootHash = rootHashFromPath(new Uint8Array(tapLeaf.controlBlock), leafHash);
|
|
361
|
+
return equals(rootHash, merkleRoot);
|
|
343
362
|
}
|
|
344
363
|
|
|
345
364
|
/**
|
|
@@ -347,19 +366,20 @@ function isTapLeafInTree(tapLeaf: TapLeafScript, merkleRoot?: Buffer): boolean {
|
|
|
347
366
|
*
|
|
348
367
|
* @param input - The PsbtInput object.
|
|
349
368
|
* @param tapLeaf - The TapLeafScript object.
|
|
350
|
-
* @returns An array of sorted signatures as
|
|
369
|
+
* @returns An array of sorted signatures as Uint8Arrays.
|
|
351
370
|
*/
|
|
352
|
-
function sortSignatures(input: PsbtInput, tapLeaf: TapLeafScript):
|
|
371
|
+
function sortSignatures(input: PsbtInput, tapLeaf: TapLeafScript): Uint8Array[] {
|
|
372
|
+
const tapLeafScript = new Uint8Array(tapLeaf.script);
|
|
353
373
|
const leafHash = tapleafHash({
|
|
354
|
-
output:
|
|
374
|
+
output: tapLeafScript,
|
|
355
375
|
version: tapLeaf.leafVersion,
|
|
356
376
|
});
|
|
357
377
|
|
|
358
378
|
return (input.tapScriptSig || [])
|
|
359
|
-
.filter((tss) => tss.leafHash
|
|
360
|
-
.map((tss) => addPubkeyPositionInScript(
|
|
379
|
+
.filter((tss) => equals(new Uint8Array(tss.leafHash), leafHash))
|
|
380
|
+
.map((tss) => addPubkeyPositionInScript(tapLeafScript, tss))
|
|
361
381
|
.sort((t1, t2) => t2.positionInScript - t1.positionInScript)
|
|
362
|
-
.map((t) => t.signature);
|
|
382
|
+
.map((t) => new Uint8Array(t.signature));
|
|
363
383
|
}
|
|
364
384
|
|
|
365
385
|
/**
|
|
@@ -368,10 +388,10 @@ function sortSignatures(input: PsbtInput, tapLeaf: TapLeafScript): Buffer[] {
|
|
|
368
388
|
* @param tss The TapScriptSig object to add the position to.
|
|
369
389
|
* @returns A TapScriptSigWitPosition object with the added position.
|
|
370
390
|
*/
|
|
371
|
-
function addPubkeyPositionInScript(script:
|
|
391
|
+
function addPubkeyPositionInScript(script: Uint8Array, tss: TapScriptSig): TapScriptSigWitPosition {
|
|
372
392
|
return Object.assign(
|
|
373
393
|
{
|
|
374
|
-
positionInScript: pubkeyPositionInScript(tss.pubkey, script),
|
|
394
|
+
positionInScript: pubkeyPositionInScript(new Uint8Array(tss.pubkey), script),
|
|
375
395
|
},
|
|
376
396
|
tss,
|
|
377
397
|
) as TapScriptSigWitPosition;
|
|
@@ -383,7 +403,7 @@ function addPubkeyPositionInScript(script: Buffer, tss: TapScriptSig): TapScript
|
|
|
383
403
|
function findTapLeafToFinalize(
|
|
384
404
|
input: PsbtInput,
|
|
385
405
|
inputIndex: number,
|
|
386
|
-
leafHashToFinalize?:
|
|
406
|
+
leafHashToFinalize?: Uint8Array,
|
|
387
407
|
): TapLeafScript {
|
|
388
408
|
const { tapScriptSig } = input;
|
|
389
409
|
if (!tapScriptSig || !tapScriptSig.length)
|
|
@@ -413,15 +433,16 @@ function findTapLeafToFinalize(
|
|
|
413
433
|
function canFinalizeLeaf(
|
|
414
434
|
leaf: TapLeafScript,
|
|
415
435
|
tapScriptSig: TapScriptSig[],
|
|
416
|
-
hash?:
|
|
436
|
+
hash?: Uint8Array,
|
|
417
437
|
): boolean {
|
|
418
438
|
const leafHash = tapleafHash({
|
|
419
|
-
output: leaf.script,
|
|
439
|
+
output: new Uint8Array(leaf.script),
|
|
420
440
|
version: leaf.leafVersion,
|
|
421
441
|
});
|
|
422
|
-
const whiteListedHash = !hash ||
|
|
442
|
+
const whiteListedHash = !hash || equals(hash, leafHash);
|
|
423
443
|
return (
|
|
424
|
-
whiteListedHash &&
|
|
444
|
+
whiteListedHash &&
|
|
445
|
+
tapScriptSig.find((tss) => equals(new Uint8Array(tss.leafHash), leafHash)) !== undefined
|
|
425
446
|
);
|
|
426
447
|
}
|
|
427
448
|
|