@btc-vision/bitcoin 6.4.9 → 6.4.11
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/.babelrc +4 -4
- package/.mocharc.json +13 -13
- package/.prettierrc.json +12 -12
- package/CHANGELOG.md +403 -403
- package/CONTRIBUTING.md +83 -83
- package/LICENSE +21 -21
- package/README.md +201 -201
- package/browser/index.d.ts +1 -1
- package/browser/index.js +1 -1
- package/browser/{ops.d.ts → opcodes.d.ts} +2 -3
- package/browser/script.d.ts +2 -2
- package/build/address.js +2 -1
- package/build/index.d.ts +1 -1
- package/build/index.js +1 -1
- package/build/{ops.d.ts → opcodes.d.ts} +2 -3
- package/build/{ops.js → opcodes.js} +4 -5
- package/build/payments/embed.js +1 -1
- package/build/payments/p2ms.js +1 -1
- package/build/payments/p2op.js +1 -1
- package/build/payments/p2pk.js +1 -1
- package/build/payments/p2pkh.js +1 -1
- package/build/payments/p2sh.js +3 -3
- package/build/payments/p2tr.js +1 -1
- package/build/payments/p2wpkh.js +2 -2
- package/build/payments/p2wsh.js +2 -2
- package/build/push_data.js +9 -9
- package/build/script.d.ts +2 -2
- package/build/script.js +12 -12
- package/build/transaction.js +1 -1
- package/cjs/package.json +3 -3
- package/gulpfile.js +42 -42
- package/package.json +150 -150
- package/src/address.ts +304 -303
- package/src/bip66.ts +107 -107
- package/src/block.ts +233 -233
- package/src/bufferutils.ts +188 -188
- package/src/crypto.ts +108 -108
- package/src/ecc_lib.ts +94 -94
- package/src/hooks/AdvancedSignatureManager.ts +104 -104
- package/src/hooks/SignatureManager.ts +84 -84
- package/src/index.ts +105 -105
- package/src/merkle.ts +31 -31
- package/src/{ops.ts → opcodes.ts} +280 -282
- package/src/payments/bip341.ts +140 -140
- package/src/payments/embed.ts +61 -61
- package/src/payments/index.ts +172 -172
- package/src/payments/lazy.ts +28 -28
- package/src/payments/p2ms.ts +156 -156
- package/src/payments/p2op.ts +195 -195
- package/src/payments/p2pk.ts +93 -93
- package/src/payments/p2pkh.ts +214 -214
- package/src/payments/p2sh.ts +210 -210
- package/src/payments/p2tr.ts +309 -309
- package/src/payments/p2wpkh.ts +144 -144
- package/src/payments/p2wsh.ts +217 -217
- package/src/psbt/bip371.ts +441 -441
- package/src/push_data.ts +97 -97
- package/src/script.ts +247 -247
- package/src/script_number.ts +72 -72
- package/src/script_signature.ts +91 -91
- package/src/transaction.ts +656 -656
- package/test/address.spec.ts +155 -155
- package/test/bitcoin.core.spec.ts +212 -212
- package/test/block.spec.ts +171 -171
- package/test/bufferutils.spec.ts +450 -450
- package/test/crypto.spec.ts +49 -49
- package/test/fixtures/address.json +329 -329
- package/test/fixtures/block.json +148 -148
- package/test/fixtures/bufferutils.json +102 -102
- package/test/fixtures/core/README.md +26 -26
- package/test/fixtures/core/base58_encode_decode.json +50 -50
- package/test/fixtures/core/base58_keys_invalid.json +152 -152
- package/test/fixtures/core/base58_keys_valid.json +452 -452
- package/test/fixtures/core/blocks.json +27 -27
- package/test/fixtures/core/sig_canonical.json +7 -7
- package/test/fixtures/core/sig_noncanonical.json +33 -33
- package/test/fixtures/core/sighash.json +3505 -3505
- package/test/fixtures/core/tx_valid.json +2023 -2023
- package/test/fixtures/crypto.json +43 -43
- package/test/fixtures/ecdsa.json +217 -217
- package/test/fixtures/ecpair.json +141 -141
- package/test/fixtures/embed.json +108 -108
- package/test/fixtures/p2ms.json +434 -434
- package/test/fixtures/p2pk.json +179 -179
- package/test/fixtures/p2pkh.json +276 -276
- package/test/fixtures/p2sh.json +508 -508
- package/test/fixtures/p2tr.json +1198 -1198
- package/test/fixtures/p2wpkh.json +290 -290
- package/test/fixtures/p2wsh.json +489 -489
- package/test/fixtures/psbt.json +924 -924
- package/test/fixtures/script.json +465 -465
- package/test/fixtures/script_number.json +225 -225
- package/test/fixtures/signature.json +140 -140
- package/test/fixtures/transaction.json +916 -916
- package/test/integration/_regtest.ts +6 -6
- package/test/integration/addresses.spec.ts +142 -142
- package/test/integration/bip32.spec.ts +130 -130
- package/test/integration/blocks.spec.ts +28 -28
- package/test/integration/cltv.spec.ts +241 -241
- package/test/integration/csv.spec.ts +452 -452
- package/test/integration/payments.spec.ts +110 -110
- package/test/integration/taproot.spec.ts +663 -663
- package/test/integration/transactions.spec.ts +668 -668
- package/test/payments.spec.ts +114 -114
- package/test/payments.utils.ts +165 -165
- package/test/psbt.spec.ts +1285 -1285
- package/test/script.spec.ts +186 -186
- package/test/script_number.spec.ts +26 -26
- package/test/script_signature.spec.ts +66 -66
- package/test/transaction.spec.ts +337 -337
- package/test/ts-node-register.js +7 -7
- package/test/tsconfig.json +48 -48
- package/test/types.spec.ts +53 -53
- package/tsconfig.base.json +27 -27
- package/tsconfig.json +19 -19
- package/tsconfig.webpack.json +18 -18
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/.ready +0 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/.release-please-manifest.json +0 -3
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/CHANGELOG.md +0 -962
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/CONTRIBUTING.md +0 -34
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/LICENSE +0 -24
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/README.md +0 -273
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/SECURITY.md +0 -2
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/addon.gypi +0 -204
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/bin/node-gyp.js +0 -138
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/.release-please-manifest.json +0 -3
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/LICENSE +0 -28
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/data/ninja/build.ninja +0 -4
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc +0 -12
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/GypVsCMake.md +0 -116
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/Hacking.md +0 -46
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/InputFormatReference.md +0 -1080
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/LanguageSpecification.md +0 -430
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/README.md +0 -27
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/Testing.md +0 -450
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/docs/UserDocumentation.md +0 -965
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp +0 -8
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp.bat +0 -5
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/gyp_main.py +0 -45
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +0 -365
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +0 -206
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +0 -1272
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +0 -1547
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +0 -59
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +0 -153
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +0 -271
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +0 -574
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +0 -692
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/common.py +0 -711
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +0 -171
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +0 -169
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +0 -113
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +0 -55
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +0 -804
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +0 -1173
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +0 -1318
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +0 -127
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +0 -103
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +0 -461
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +0 -89
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +0 -57
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +0 -2745
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +0 -3976
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +0 -44
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +0 -2964
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +0 -67
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +0 -1391
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +0 -25
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/input.py +0 -3115
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +0 -98
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +0 -771
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +0 -1260
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +0 -174
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +0 -61
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +0 -373
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +0 -1938
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation_test.py +0 -53
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +0 -302
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +0 -3198
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +0 -65
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE +0 -3
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE +0 -177
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD +0 -23
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/__init__.py +0 -15
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py +0 -108
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py +0 -252
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py +0 -83
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_parser.py +0 -359
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_structures.py +0 -61
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py +0 -192
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/markers.py +0 -252
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/metadata.py +0 -825
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/py.typed +0 -0
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/requirements.py +0 -90
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py +0 -1030
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/tags.py +0 -553
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/utils.py +0 -172
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pylib/packaging/version.py +0 -563
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/pyproject.toml +0 -120
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/release-please-config.json +0 -11
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/gyp/test_gyp.py +0 -261
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/Find-VisualStudio.cs +0 -250
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/build.js +0 -227
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/clean.js +0 -15
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/configure.js +0 -328
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/create-config-gypi.js +0 -150
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/download.js +0 -39
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-node-directory.js +0 -63
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-python.js +0 -310
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/find-visualstudio.js +0 -590
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/install.js +0 -415
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/list.js +0 -26
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/log.js +0 -168
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/node-gyp.js +0 -188
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/process-release.js +0 -146
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/rebuild.js +0 -12
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/remove.js +0 -43
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/lib/util.js +0 -81
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/macOS_Catalina_acid_test.sh +0 -21
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/package.json +0 -51
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/release-please-config.json +0 -40
- package/.yarn/unplugged/node-gyp-npm-10.2.0-cad1109948/node_modules/node-gyp/src/win_delay_load_hook.cc +0 -39
- package/coverage/tmp/coverage-31752-1735543485354-0.json +0 -1
- package/coverage/tmp/coverage-59920-1735543484555-0.json +0 -1
- package/coverage/tmp/coverage-66252-1735543483919-0.json +0 -1
- package/coverage/tmp/coverage-68440-1735543485236-0.json +0 -1
- package/coverage/tmp/coverage-70588-1735543484426-0.json +0 -1
- package/coverage/tmp/coverage-79292-1735543485296-0.json +0 -1
- package/coverage/tmp/coverage-80212-1735543483980-0.json +0 -1
package/src/payments/bip341.ts
CHANGED
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
import { Buffer as NBuffer } from 'buffer';
|
|
2
|
-
import * as bcrypto from '../crypto.js';
|
|
3
|
-
import { getEccLib } from '../ecc_lib.js';
|
|
4
|
-
|
|
5
|
-
import { varuint } from '../bufferutils.js';
|
|
6
|
-
import { isTapleaf, Tapleaf, Taptree } from '../types.js';
|
|
7
|
-
|
|
8
|
-
export const LEAF_VERSION_TAPSCRIPT = 0xc0;
|
|
9
|
-
export const MAX_TAPTREE_DEPTH = 128;
|
|
10
|
-
|
|
11
|
-
interface HashLeaf {
|
|
12
|
-
hash: Buffer;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
interface HashBranch {
|
|
16
|
-
hash: Buffer;
|
|
17
|
-
left: HashTree;
|
|
18
|
-
right: HashTree;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface TweakedPublicKey {
|
|
22
|
-
parity: number;
|
|
23
|
-
x: Buffer;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const isHashBranch = (ht: HashTree): ht is HashBranch => 'left' in ht && 'right' in ht;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Binary tree representing leaf, branch, and root node hashes of a Taptree.
|
|
30
|
-
* Each node contains a hash, and potentially left and right branch hashes.
|
|
31
|
-
* This tree is used for 2 purposes: Providing the root hash for tweaking,
|
|
32
|
-
* and calculating merkle inclusion proofs when constructing a control block.
|
|
33
|
-
*/
|
|
34
|
-
export type HashTree = HashLeaf | HashBranch;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Calculates the root hash from a given control block and leaf hash.
|
|
38
|
-
* @param controlBlock - The control block buffer.
|
|
39
|
-
* @param leafHash - The leaf hash buffer.
|
|
40
|
-
* @returns The root hash buffer.
|
|
41
|
-
* @throws {TypeError} If the control block length is less than 33.
|
|
42
|
-
*/
|
|
43
|
-
export function rootHashFromPath(controlBlock: Buffer, leafHash: Buffer): Buffer {
|
|
44
|
-
if (controlBlock.length < 33)
|
|
45
|
-
throw new TypeError(
|
|
46
|
-
`The control-block length is too small. Got ${controlBlock.length}, expected min 33.`,
|
|
47
|
-
);
|
|
48
|
-
const m = (controlBlock.length - 33) / 32;
|
|
49
|
-
|
|
50
|
-
let kj = leafHash;
|
|
51
|
-
for (let j = 0; j < m; j++) {
|
|
52
|
-
const ej = controlBlock.slice(33 + 32 * j, 65 + 32 * j);
|
|
53
|
-
if (kj.compare(ej) < 0) {
|
|
54
|
-
kj = tapBranchHash(kj, ej);
|
|
55
|
-
} else {
|
|
56
|
-
kj = tapBranchHash(ej, kj);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return kj;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Build a hash tree of merkle nodes from the scripts binary tree.
|
|
65
|
-
* @param scriptTree - the tree of scripts to pairwise hash.
|
|
66
|
-
*/
|
|
67
|
-
export function toHashTree(scriptTree: Taptree): HashTree {
|
|
68
|
-
if (isTapleaf(scriptTree)) return { hash: tapleafHash(scriptTree) };
|
|
69
|
-
|
|
70
|
-
const hashes = [toHashTree(scriptTree[0]), toHashTree(scriptTree[1])];
|
|
71
|
-
hashes.sort((a, b) => a.hash.compare(b.hash));
|
|
72
|
-
const [left, right] = hashes;
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
hash: tapBranchHash(left.hash, right.hash),
|
|
76
|
-
left,
|
|
77
|
-
right,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Given a HashTree, finds the path from a particular hash to the root.
|
|
83
|
-
* @param node - the root of the tree
|
|
84
|
-
* @param hash - the hash to search for
|
|
85
|
-
* @returns - array of sibling hashes, from leaf (inclusive) to root
|
|
86
|
-
* (exclusive) needed to prove inclusion of the specified hash. undefined if no
|
|
87
|
-
* path is found
|
|
88
|
-
*/
|
|
89
|
-
export function findScriptPath(node: HashTree, hash: Buffer): Buffer[] | undefined {
|
|
90
|
-
if (isHashBranch(node)) {
|
|
91
|
-
const leftPath = findScriptPath(node.left, hash);
|
|
92
|
-
if (leftPath !== undefined) return [...leftPath, node.right.hash];
|
|
93
|
-
|
|
94
|
-
const rightPath = findScriptPath(node.right, hash);
|
|
95
|
-
if (rightPath !== undefined) return [...rightPath, node.left.hash];
|
|
96
|
-
} else if (node.hash.equals(hash)) {
|
|
97
|
-
return [];
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return undefined;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export function tapleafHash(leaf: Tapleaf): Buffer {
|
|
104
|
-
const version = leaf.version || LEAF_VERSION_TAPSCRIPT;
|
|
105
|
-
return bcrypto.taggedHash(
|
|
106
|
-
'TapLeaf',
|
|
107
|
-
NBuffer.concat([NBuffer.from([version]), serializeScript(leaf.output)]),
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function tapTweakHash(pubKey: Buffer, h: Buffer | undefined): Buffer {
|
|
112
|
-
return bcrypto.taggedHash('TapTweak', NBuffer.concat(h ? [pubKey, h] : [pubKey]));
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export function tweakKey(pubKey: Buffer, h: Buffer | undefined): TweakedPublicKey | null {
|
|
116
|
-
if (!NBuffer.isBuffer(pubKey)) return null;
|
|
117
|
-
if (pubKey.length !== 32) return null;
|
|
118
|
-
if (h && h.length !== 32) return null;
|
|
119
|
-
|
|
120
|
-
const tweakHash = tapTweakHash(pubKey, h);
|
|
121
|
-
|
|
122
|
-
const res = getEccLib().xOnlyPointAddTweak(pubKey, tweakHash);
|
|
123
|
-
if (!res || res.xOnlyPubkey === null) return null;
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
parity: res.parity,
|
|
127
|
-
x: NBuffer.from(res.xOnlyPubkey),
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function tapBranchHash(a: Buffer, b: Buffer): Buffer {
|
|
132
|
-
return bcrypto.taggedHash('TapBranch', NBuffer.concat([a, b]));
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function serializeScript(s: Buffer): Buffer {
|
|
136
|
-
const varintLen = varuint.encodingLength(s.length);
|
|
137
|
-
const buffer = NBuffer.allocUnsafe(varintLen); // better
|
|
138
|
-
varuint.encode(s.length, buffer);
|
|
139
|
-
return NBuffer.concat([buffer, s]);
|
|
140
|
-
}
|
|
1
|
+
import { Buffer as NBuffer } from 'buffer';
|
|
2
|
+
import * as bcrypto from '../crypto.js';
|
|
3
|
+
import { getEccLib } from '../ecc_lib.js';
|
|
4
|
+
|
|
5
|
+
import { varuint } from '../bufferutils.js';
|
|
6
|
+
import { isTapleaf, Tapleaf, Taptree } from '../types.js';
|
|
7
|
+
|
|
8
|
+
export const LEAF_VERSION_TAPSCRIPT = 0xc0;
|
|
9
|
+
export const MAX_TAPTREE_DEPTH = 128;
|
|
10
|
+
|
|
11
|
+
interface HashLeaf {
|
|
12
|
+
hash: Buffer;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface HashBranch {
|
|
16
|
+
hash: Buffer;
|
|
17
|
+
left: HashTree;
|
|
18
|
+
right: HashTree;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface TweakedPublicKey {
|
|
22
|
+
parity: number;
|
|
23
|
+
x: Buffer;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const isHashBranch = (ht: HashTree): ht is HashBranch => 'left' in ht && 'right' in ht;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Binary tree representing leaf, branch, and root node hashes of a Taptree.
|
|
30
|
+
* Each node contains a hash, and potentially left and right branch hashes.
|
|
31
|
+
* This tree is used for 2 purposes: Providing the root hash for tweaking,
|
|
32
|
+
* and calculating merkle inclusion proofs when constructing a control block.
|
|
33
|
+
*/
|
|
34
|
+
export type HashTree = HashLeaf | HashBranch;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Calculates the root hash from a given control block and leaf hash.
|
|
38
|
+
* @param controlBlock - The control block buffer.
|
|
39
|
+
* @param leafHash - The leaf hash buffer.
|
|
40
|
+
* @returns The root hash buffer.
|
|
41
|
+
* @throws {TypeError} If the control block length is less than 33.
|
|
42
|
+
*/
|
|
43
|
+
export function rootHashFromPath(controlBlock: Buffer, leafHash: Buffer): Buffer {
|
|
44
|
+
if (controlBlock.length < 33)
|
|
45
|
+
throw new TypeError(
|
|
46
|
+
`The control-block length is too small. Got ${controlBlock.length}, expected min 33.`,
|
|
47
|
+
);
|
|
48
|
+
const m = (controlBlock.length - 33) / 32;
|
|
49
|
+
|
|
50
|
+
let kj = leafHash;
|
|
51
|
+
for (let j = 0; j < m; j++) {
|
|
52
|
+
const ej = controlBlock.slice(33 + 32 * j, 65 + 32 * j);
|
|
53
|
+
if (kj.compare(ej) < 0) {
|
|
54
|
+
kj = tapBranchHash(kj, ej);
|
|
55
|
+
} else {
|
|
56
|
+
kj = tapBranchHash(ej, kj);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return kj;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Build a hash tree of merkle nodes from the scripts binary tree.
|
|
65
|
+
* @param scriptTree - the tree of scripts to pairwise hash.
|
|
66
|
+
*/
|
|
67
|
+
export function toHashTree(scriptTree: Taptree): HashTree {
|
|
68
|
+
if (isTapleaf(scriptTree)) return { hash: tapleafHash(scriptTree) };
|
|
69
|
+
|
|
70
|
+
const hashes = [toHashTree(scriptTree[0]), toHashTree(scriptTree[1])];
|
|
71
|
+
hashes.sort((a, b) => a.hash.compare(b.hash));
|
|
72
|
+
const [left, right] = hashes;
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
hash: tapBranchHash(left.hash, right.hash),
|
|
76
|
+
left,
|
|
77
|
+
right,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Given a HashTree, finds the path from a particular hash to the root.
|
|
83
|
+
* @param node - the root of the tree
|
|
84
|
+
* @param hash - the hash to search for
|
|
85
|
+
* @returns - array of sibling hashes, from leaf (inclusive) to root
|
|
86
|
+
* (exclusive) needed to prove inclusion of the specified hash. undefined if no
|
|
87
|
+
* path is found
|
|
88
|
+
*/
|
|
89
|
+
export function findScriptPath(node: HashTree, hash: Buffer): Buffer[] | undefined {
|
|
90
|
+
if (isHashBranch(node)) {
|
|
91
|
+
const leftPath = findScriptPath(node.left, hash);
|
|
92
|
+
if (leftPath !== undefined) return [...leftPath, node.right.hash];
|
|
93
|
+
|
|
94
|
+
const rightPath = findScriptPath(node.right, hash);
|
|
95
|
+
if (rightPath !== undefined) return [...rightPath, node.left.hash];
|
|
96
|
+
} else if (node.hash.equals(hash)) {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function tapleafHash(leaf: Tapleaf): Buffer {
|
|
104
|
+
const version = leaf.version || LEAF_VERSION_TAPSCRIPT;
|
|
105
|
+
return bcrypto.taggedHash(
|
|
106
|
+
'TapLeaf',
|
|
107
|
+
NBuffer.concat([NBuffer.from([version]), serializeScript(leaf.output)]),
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function tapTweakHash(pubKey: Buffer, h: Buffer | undefined): Buffer {
|
|
112
|
+
return bcrypto.taggedHash('TapTweak', NBuffer.concat(h ? [pubKey, h] : [pubKey]));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function tweakKey(pubKey: Buffer, h: Buffer | undefined): TweakedPublicKey | null {
|
|
116
|
+
if (!NBuffer.isBuffer(pubKey)) return null;
|
|
117
|
+
if (pubKey.length !== 32) return null;
|
|
118
|
+
if (h && h.length !== 32) return null;
|
|
119
|
+
|
|
120
|
+
const tweakHash = tapTweakHash(pubKey, h);
|
|
121
|
+
|
|
122
|
+
const res = getEccLib().xOnlyPointAddTweak(pubKey, tweakHash);
|
|
123
|
+
if (!res || res.xOnlyPubkey === null) return null;
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
parity: res.parity,
|
|
127
|
+
x: NBuffer.from(res.xOnlyPubkey),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function tapBranchHash(a: Buffer, b: Buffer): Buffer {
|
|
132
|
+
return bcrypto.taggedHash('TapBranch', NBuffer.concat([a, b]));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function serializeScript(s: Buffer): Buffer {
|
|
136
|
+
const varintLen = varuint.encodingLength(s.length);
|
|
137
|
+
const buffer = NBuffer.allocUnsafe(varintLen); // better
|
|
138
|
+
varuint.encode(s.length, buffer);
|
|
139
|
+
return NBuffer.concat([buffer, s]);
|
|
140
|
+
}
|
package/src/payments/embed.ts
CHANGED
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
import { bitcoin as BITCOIN_NETWORK } from '../networks.js';
|
|
2
|
-
import * as bscript from '../script.js';
|
|
3
|
-
import { stacksEqual, typeforce as typef } from '../types.js';
|
|
4
|
-
import { EmbedPayment, PaymentOpts, PaymentType, Stack } from './index.js';
|
|
5
|
-
import * as lazy from './lazy.js';
|
|
6
|
-
|
|
7
|
-
const OPS = bscript.
|
|
8
|
-
|
|
9
|
-
// output: OP_RETURN ...
|
|
10
|
-
/**
|
|
11
|
-
* Embeds data in a Bitcoin payment.
|
|
12
|
-
* @param a - The payment object.
|
|
13
|
-
* @param opts - Optional payment options.
|
|
14
|
-
* @returns The modified payment object.
|
|
15
|
-
* @throws {TypeError} If there is not enough data or if the output is invalid.
|
|
16
|
-
*/
|
|
17
|
-
export function p2data(a: Omit<EmbedPayment, 'name'>, opts?: PaymentOpts): EmbedPayment {
|
|
18
|
-
if (!a.data && !a.output) throw new TypeError('Not enough data');
|
|
19
|
-
opts = Object.assign({ validate: true }, opts || {});
|
|
20
|
-
|
|
21
|
-
typef(
|
|
22
|
-
{
|
|
23
|
-
network: typef.maybe(typef.Object),
|
|
24
|
-
output: typef.maybe(typef.Buffer),
|
|
25
|
-
data: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
26
|
-
},
|
|
27
|
-
a,
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
const network = a.network || BITCOIN_NETWORK;
|
|
31
|
-
const o: EmbedPayment = { name: PaymentType.Embed, network, data: [] };
|
|
32
|
-
|
|
33
|
-
lazy.prop(o, 'output', () => {
|
|
34
|
-
if (!a.data) return;
|
|
35
|
-
return bscript.compile(([OPS.OP_RETURN] as Stack).concat(a.data));
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
lazy.prop(o, 'data', () => {
|
|
39
|
-
if (!a.output) return;
|
|
40
|
-
const script = bscript.decompile(a.output);
|
|
41
|
-
if (script === null || script === undefined) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return script.slice(1) as Buffer[];
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// extended validation
|
|
49
|
-
if (opts.validate) {
|
|
50
|
-
if (a.output) {
|
|
51
|
-
const chunks = bscript.decompile(a.output);
|
|
52
|
-
if (chunks![0] !== OPS.OP_RETURN) throw new TypeError('Output is invalid');
|
|
53
|
-
if (!chunks!.slice(1).every(typef.Buffer)) throw new TypeError('Output is invalid');
|
|
54
|
-
|
|
55
|
-
if (a.data && !stacksEqual(a.data, o.data as Buffer[]))
|
|
56
|
-
throw new TypeError('Data mismatch');
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return Object.assign(o, a);
|
|
61
|
-
}
|
|
1
|
+
import { bitcoin as BITCOIN_NETWORK } from '../networks.js';
|
|
2
|
+
import * as bscript from '../script.js';
|
|
3
|
+
import { stacksEqual, typeforce as typef } from '../types.js';
|
|
4
|
+
import { EmbedPayment, PaymentOpts, PaymentType, Stack } from './index.js';
|
|
5
|
+
import * as lazy from './lazy.js';
|
|
6
|
+
|
|
7
|
+
const OPS = bscript.opcodes;
|
|
8
|
+
|
|
9
|
+
// output: OP_RETURN ...
|
|
10
|
+
/**
|
|
11
|
+
* Embeds data in a Bitcoin payment.
|
|
12
|
+
* @param a - The payment object.
|
|
13
|
+
* @param opts - Optional payment options.
|
|
14
|
+
* @returns The modified payment object.
|
|
15
|
+
* @throws {TypeError} If there is not enough data or if the output is invalid.
|
|
16
|
+
*/
|
|
17
|
+
export function p2data(a: Omit<EmbedPayment, 'name'>, opts?: PaymentOpts): EmbedPayment {
|
|
18
|
+
if (!a.data && !a.output) throw new TypeError('Not enough data');
|
|
19
|
+
opts = Object.assign({ validate: true }, opts || {});
|
|
20
|
+
|
|
21
|
+
typef(
|
|
22
|
+
{
|
|
23
|
+
network: typef.maybe(typef.Object),
|
|
24
|
+
output: typef.maybe(typef.Buffer),
|
|
25
|
+
data: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
26
|
+
},
|
|
27
|
+
a,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const network = a.network || BITCOIN_NETWORK;
|
|
31
|
+
const o: EmbedPayment = { name: PaymentType.Embed, network, data: [] };
|
|
32
|
+
|
|
33
|
+
lazy.prop(o, 'output', () => {
|
|
34
|
+
if (!a.data) return;
|
|
35
|
+
return bscript.compile(([OPS.OP_RETURN] as Stack).concat(a.data));
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
lazy.prop(o, 'data', () => {
|
|
39
|
+
if (!a.output) return;
|
|
40
|
+
const script = bscript.decompile(a.output);
|
|
41
|
+
if (script === null || script === undefined) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return script.slice(1) as Buffer[];
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// extended validation
|
|
49
|
+
if (opts.validate) {
|
|
50
|
+
if (a.output) {
|
|
51
|
+
const chunks = bscript.decompile(a.output);
|
|
52
|
+
if (chunks![0] !== OPS.OP_RETURN) throw new TypeError('Output is invalid');
|
|
53
|
+
if (!chunks!.slice(1).every(typef.Buffer)) throw new TypeError('Output is invalid');
|
|
54
|
+
|
|
55
|
+
if (a.data && !stacksEqual(a.data, o.data as Buffer[]))
|
|
56
|
+
throw new TypeError('Data mismatch');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return Object.assign(o, a);
|
|
61
|
+
}
|