@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/address.ts
CHANGED
|
@@ -1,303 +1,304 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* bitcoin address decode and encode tools, include base58、bech32 and output script
|
|
3
|
-
*
|
|
4
|
-
* networks support bitcoin、bitcoin testnet and bitcoin regtest
|
|
5
|
-
*
|
|
6
|
-
* addresses support P2PKH、P2SH、P2WPKH、P2WSH、P2TR and so on
|
|
7
|
-
*
|
|
8
|
-
* @packageDocumentation
|
|
9
|
-
*/
|
|
10
|
-
import { bech32, bech32m } from 'bech32';
|
|
11
|
-
import * as bs58check from 'bs58check';
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import { Hash160bit, tuple, typeforce, UInt8 } from './types.js';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
hash
|
|
22
|
-
|
|
23
|
-
version:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
version:
|
|
30
|
-
|
|
31
|
-
prefix:
|
|
32
|
-
|
|
33
|
-
data
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
export const
|
|
38
|
-
export const
|
|
39
|
-
export const
|
|
40
|
-
export const
|
|
41
|
-
export const
|
|
42
|
-
export const
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
'
|
|
46
|
-
'
|
|
47
|
-
'
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* @param
|
|
75
|
-
* @
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (!
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (payload.length
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
let
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
payload.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
words.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
let
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
network.
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
decodeBech32.version
|
|
287
|
-
decodeBech32.
|
|
288
|
-
decodeBech32.data.length
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
decodeBech32.
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
1
|
+
/**
|
|
2
|
+
* bitcoin address decode and encode tools, include base58、bech32 and output script
|
|
3
|
+
*
|
|
4
|
+
* networks support bitcoin、bitcoin testnet and bitcoin regtest
|
|
5
|
+
*
|
|
6
|
+
* addresses support P2PKH、P2SH、P2WPKH、P2WSH、P2TR and so on
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
import { bech32, bech32m } from 'bech32';
|
|
11
|
+
import * as bs58check from 'bs58check';
|
|
12
|
+
import * as networks from './networks.js';
|
|
13
|
+
import { Network } from './networks.js';
|
|
14
|
+
import * as bscript from './script.js';
|
|
15
|
+
import { opcodes } from './script.js';
|
|
16
|
+
import { Hash160bit, tuple, typeforce, UInt8 } from './types.js';
|
|
17
|
+
import { payments } from './index.js';
|
|
18
|
+
|
|
19
|
+
/** base58check decode result */
|
|
20
|
+
export interface Base58CheckResult {
|
|
21
|
+
/** address hash */
|
|
22
|
+
hash: Buffer;
|
|
23
|
+
/** address version: 0x00 for P2PKH, 0x05 for P2SH */
|
|
24
|
+
version: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** bech32 decode result */
|
|
28
|
+
export interface Bech32Result {
|
|
29
|
+
/** address version: 0x00 for P2WPKH、P2WSH, 0x01 for P2TR*/
|
|
30
|
+
version: number;
|
|
31
|
+
/** address prefix: bc for P2WPKH、P2WSH、P2TR */
|
|
32
|
+
prefix: string;
|
|
33
|
+
/** address data:20 bytes for P2WPKH, 32 bytes for P2WSH、P2TR */
|
|
34
|
+
data: Buffer;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const FUTURE_SEGWIT_MAX_SIZE: number = 40;
|
|
38
|
+
export const FUTURE_SEGWIT_MIN_SIZE: number = 2;
|
|
39
|
+
export const FUTURE_SEGWIT_MAX_VERSION: number = 15;
|
|
40
|
+
export const FUTURE_MAX_VERSION: number = 16;
|
|
41
|
+
export const FUTURE_OPNET_VERSION: number = 16;
|
|
42
|
+
export const FUTURE_SEGWIT_MIN_VERSION: number = 2;
|
|
43
|
+
export const FUTURE_SEGWIT_VERSION_DIFF: number = 0x50;
|
|
44
|
+
const FUTURE_SEGWIT_VERSION_WARNING: string =
|
|
45
|
+
'WARNING: Sending to a future segwit version address can lead to loss of funds. ' +
|
|
46
|
+
'End users MUST be warned carefully in the GUI and asked if they wish to proceed ' +
|
|
47
|
+
'with caution. Wallets should verify the segwit version from the output of fromBech32, ' +
|
|
48
|
+
'then decide when it is safe to use which version of segwit.';
|
|
49
|
+
|
|
50
|
+
export const isUnknownSegwitVersion = (output: Buffer): boolean => {
|
|
51
|
+
try {
|
|
52
|
+
const data = Buffer.from(output.subarray(2));
|
|
53
|
+
if (data.length < FUTURE_SEGWIT_MIN_SIZE || data.length > FUTURE_SEGWIT_MAX_SIZE) {
|
|
54
|
+
throw new TypeError('Invalid program length for segwit address');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const version = output[0] - FUTURE_SEGWIT_VERSION_DIFF;
|
|
58
|
+
if (version < FUTURE_SEGWIT_MIN_VERSION || version > FUTURE_SEGWIT_MAX_VERSION + 1) {
|
|
59
|
+
throw new TypeError('Invalid version for segwit address');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (version === 1) throw new TypeError('taproot');
|
|
63
|
+
|
|
64
|
+
return true;
|
|
65
|
+
} catch (e) {}
|
|
66
|
+
|
|
67
|
+
return false;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Encode a future Taproot-style segwit address (SegWit v2 - v16) using bech32m.
|
|
72
|
+
* Only for versions not yet assigned specific meanings (future use).
|
|
73
|
+
*
|
|
74
|
+
* @param output - Output script buffer containing the version and witness program
|
|
75
|
+
* @param network - Network object containing bech32 and optional bech32Opnet prefix
|
|
76
|
+
* @returns Bech32m-encoded future Taproot-style address
|
|
77
|
+
*/
|
|
78
|
+
export function toFutureOPNetAddress(output: Buffer, network: Network): string {
|
|
79
|
+
if (!Buffer.isBuffer(output)) throw new TypeError('output must be a Buffer');
|
|
80
|
+
if (!network.bech32Opnet) throw new Error('Network does not support opnet');
|
|
81
|
+
|
|
82
|
+
const opcode = output[0];
|
|
83
|
+
|
|
84
|
+
// work out where the push-data really starts
|
|
85
|
+
let pushPos = 1,
|
|
86
|
+
progLen: number;
|
|
87
|
+
if (output[1] < 0x4c) {
|
|
88
|
+
progLen = output[1];
|
|
89
|
+
pushPos = 2;
|
|
90
|
+
} else if (output[1] === 0x4c) {
|
|
91
|
+
progLen = output[2];
|
|
92
|
+
pushPos = 3;
|
|
93
|
+
} else {
|
|
94
|
+
throw new TypeError('Unsupported push opcode in script');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const program = Buffer.from(output.subarray(pushPos, pushPos + progLen));
|
|
98
|
+
|
|
99
|
+
if (program.length < FUTURE_SEGWIT_MIN_SIZE || program.length > FUTURE_SEGWIT_MAX_SIZE)
|
|
100
|
+
throw new TypeError('Invalid program length for segwit address');
|
|
101
|
+
|
|
102
|
+
const version =
|
|
103
|
+
opcode === opcodes.OP_0
|
|
104
|
+
? 0
|
|
105
|
+
: opcode >= opcodes.OP_1 && opcode <= opcodes.OP_16
|
|
106
|
+
? opcode - (opcodes.OP_1 - 1)
|
|
107
|
+
: -1;
|
|
108
|
+
|
|
109
|
+
if (version < FUTURE_SEGWIT_MAX_VERSION || version > FUTURE_MAX_VERSION)
|
|
110
|
+
throw new TypeError(`Invalid segwit version ${version}`);
|
|
111
|
+
|
|
112
|
+
const words = [version, ...bech32m.toWords(program)];
|
|
113
|
+
return bech32m.encode(network.bech32Opnet, words);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function _toFutureSegwitAddress(output: Buffer, network: Network): string {
|
|
117
|
+
const data = Buffer.from(output.subarray(2));
|
|
118
|
+
if (data.length < FUTURE_SEGWIT_MIN_SIZE || data.length > FUTURE_SEGWIT_MAX_SIZE) {
|
|
119
|
+
throw new TypeError('Invalid program length for segwit address');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const version = output[0] - FUTURE_SEGWIT_VERSION_DIFF;
|
|
123
|
+
if (version < FUTURE_SEGWIT_MIN_VERSION || version > FUTURE_SEGWIT_MAX_VERSION) {
|
|
124
|
+
throw new TypeError('Invalid version for segwit address');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (output[1] !== data.length) {
|
|
128
|
+
throw new TypeError(`Invalid script for segwit address ${output[1]} !== ${data.length}`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return toBech32(data, version, network.bech32, network.bech32Opnet);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* decode address with base58 specification, return address version and address hash if valid
|
|
136
|
+
*/
|
|
137
|
+
export function fromBase58Check(address: string): Base58CheckResult {
|
|
138
|
+
const payload = Buffer.from(bs58check.default.decode(address));
|
|
139
|
+
|
|
140
|
+
// TODO: 4.0.0, move to "toOutputScript"
|
|
141
|
+
if (payload.length < 21) throw new TypeError(address + ' is too short');
|
|
142
|
+
if (payload.length > 21) throw new TypeError(address + ' is too long');
|
|
143
|
+
|
|
144
|
+
const version = payload.readUInt8(0);
|
|
145
|
+
const hash = Buffer.from(payload.subarray(1));
|
|
146
|
+
|
|
147
|
+
return { version, hash };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* decode address with bech32 specification, return address version、address prefix and address data if valid
|
|
152
|
+
*/
|
|
153
|
+
export function fromBech32(address: string): Bech32Result {
|
|
154
|
+
let result;
|
|
155
|
+
let version;
|
|
156
|
+
try {
|
|
157
|
+
result = bech32.decode(address);
|
|
158
|
+
} catch (e) {}
|
|
159
|
+
|
|
160
|
+
if (result) {
|
|
161
|
+
version = result.words[0];
|
|
162
|
+
if (version !== 0) throw new TypeError(address + ' uses wrong encoding');
|
|
163
|
+
} else {
|
|
164
|
+
result = bech32m.decode(address);
|
|
165
|
+
version = result.words[0];
|
|
166
|
+
if (version === 0) throw new TypeError(address + ' uses wrong encoding');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const data = bech32.fromWords(result.words.slice(1));
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
version,
|
|
173
|
+
prefix: result.prefix,
|
|
174
|
+
data: Buffer.from(data),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* encode address hash to base58 address with version
|
|
180
|
+
*/
|
|
181
|
+
export function toBase58Check(hash: Buffer, version: number): string {
|
|
182
|
+
typeforce(tuple(Hash160bit, UInt8), arguments);
|
|
183
|
+
|
|
184
|
+
const payload = Buffer.allocUnsafe(21);
|
|
185
|
+
payload.writeUInt8(version, 0);
|
|
186
|
+
hash.copy(payload, 1);
|
|
187
|
+
|
|
188
|
+
return bs58check.default.encode(payload);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* encode address hash to bech32 address with version and prefix
|
|
193
|
+
*/
|
|
194
|
+
export function toBech32(
|
|
195
|
+
data: Buffer,
|
|
196
|
+
version: number,
|
|
197
|
+
prefix: string,
|
|
198
|
+
prefixOpnet?: string,
|
|
199
|
+
): string {
|
|
200
|
+
const words = bech32.toWords(data);
|
|
201
|
+
words.unshift(version);
|
|
202
|
+
|
|
203
|
+
if (version === FUTURE_OPNET_VERSION && prefixOpnet) {
|
|
204
|
+
return bech32m.encode(prefixOpnet, words);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return version === 0 ? bech32.encode(prefix, words) : bech32m.encode(prefix, words);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* decode address from output script with network, return address if matched
|
|
212
|
+
*/
|
|
213
|
+
export function fromOutputScript(output: Buffer, network?: Network): string {
|
|
214
|
+
// TODO: Network
|
|
215
|
+
network = network || networks.bitcoin;
|
|
216
|
+
|
|
217
|
+
try {
|
|
218
|
+
return payments.p2pkh({ output, network }).address as string;
|
|
219
|
+
} catch (e) {}
|
|
220
|
+
try {
|
|
221
|
+
return payments.p2sh({ output, network }).address as string;
|
|
222
|
+
} catch (e) {}
|
|
223
|
+
try {
|
|
224
|
+
return payments.p2wpkh({ output, network }).address as string;
|
|
225
|
+
} catch (e) {}
|
|
226
|
+
try {
|
|
227
|
+
return payments.p2wsh({ output, network }).address as string;
|
|
228
|
+
} catch (e) {}
|
|
229
|
+
try {
|
|
230
|
+
return payments.p2tr({ output, network }).address as string;
|
|
231
|
+
} catch (e) {}
|
|
232
|
+
try {
|
|
233
|
+
return toFutureOPNetAddress(output, network);
|
|
234
|
+
} catch (e) {}
|
|
235
|
+
try {
|
|
236
|
+
return _toFutureSegwitAddress(output, network);
|
|
237
|
+
} catch (e) {}
|
|
238
|
+
|
|
239
|
+
throw new Error(bscript.toASM(output) + ' has no matching Address');
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* encodes address to output script with network, return output script if address matched
|
|
244
|
+
*/
|
|
245
|
+
export function toOutputScript(address: string, network?: Network): Buffer {
|
|
246
|
+
network = network || networks.bitcoin;
|
|
247
|
+
|
|
248
|
+
let decodeBase58: Base58CheckResult | undefined;
|
|
249
|
+
let decodeBech32: Bech32Result | undefined;
|
|
250
|
+
try {
|
|
251
|
+
decodeBase58 = fromBase58Check(address);
|
|
252
|
+
} catch (e) {}
|
|
253
|
+
|
|
254
|
+
if (decodeBase58) {
|
|
255
|
+
if (decodeBase58.version === network.pubKeyHash)
|
|
256
|
+
return payments.p2pkh({ hash: decodeBase58.hash }).output as Buffer;
|
|
257
|
+
if (decodeBase58.version === network.scriptHash)
|
|
258
|
+
return payments.p2sh({ hash: decodeBase58.hash }).output as Buffer;
|
|
259
|
+
} else {
|
|
260
|
+
try {
|
|
261
|
+
decodeBech32 = fromBech32(address);
|
|
262
|
+
} catch (e) {}
|
|
263
|
+
|
|
264
|
+
if (decodeBech32) {
|
|
265
|
+
if (
|
|
266
|
+
decodeBech32.prefix !== network.bech32 &&
|
|
267
|
+
network.bech32Opnet &&
|
|
268
|
+
decodeBech32.prefix !== network.bech32Opnet
|
|
269
|
+
)
|
|
270
|
+
throw new Error(address + ' has an invalid prefix');
|
|
271
|
+
if (decodeBech32.version === 0) {
|
|
272
|
+
if (decodeBech32.data.length === 20)
|
|
273
|
+
return payments.p2wpkh({ hash: decodeBech32.data }).output as Buffer;
|
|
274
|
+
if (decodeBech32.data.length === 32)
|
|
275
|
+
return payments.p2wsh({ hash: decodeBech32.data }).output as Buffer;
|
|
276
|
+
} else if (decodeBech32.version === 1) {
|
|
277
|
+
if (decodeBech32.data.length === 32)
|
|
278
|
+
return payments.p2tr({ pubkey: decodeBech32.data }).output as Buffer;
|
|
279
|
+
} else if (decodeBech32.version === FUTURE_OPNET_VERSION) {
|
|
280
|
+
if (!network.bech32Opnet) throw new Error(address + ' has an invalid prefix');
|
|
281
|
+
return payments.p2op({
|
|
282
|
+
program: decodeBech32.data,
|
|
283
|
+
network,
|
|
284
|
+
}).output as Buffer;
|
|
285
|
+
} else if (
|
|
286
|
+
decodeBech32.version >= FUTURE_SEGWIT_MIN_VERSION &&
|
|
287
|
+
decodeBech32.version <= FUTURE_SEGWIT_MAX_VERSION &&
|
|
288
|
+
decodeBech32.data.length >= FUTURE_SEGWIT_MIN_SIZE &&
|
|
289
|
+
decodeBech32.data.length <= FUTURE_SEGWIT_MAX_SIZE
|
|
290
|
+
) {
|
|
291
|
+
if (decodeBech32.version !== FUTURE_OPNET_VERSION) {
|
|
292
|
+
console.warn(FUTURE_SEGWIT_VERSION_WARNING);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return bscript.compile([
|
|
296
|
+
decodeBech32.version + FUTURE_SEGWIT_VERSION_DIFF,
|
|
297
|
+
decodeBech32.data,
|
|
298
|
+
]);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return Buffer.from(address, 'hex');
|
|
304
|
+
}
|