@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/p2sh.ts
CHANGED
|
@@ -1,210 +1,210 @@
|
|
|
1
|
-
import * as bs58check from 'bs58check';
|
|
2
|
-
import * as bcrypto from '../crypto.js';
|
|
3
|
-
import { bitcoin as BITCOIN_NETWORK } from '../networks.js';
|
|
4
|
-
import * as bscript from '../script.js';
|
|
5
|
-
import { stacksEqual, typeforce as typef } from '../types.js';
|
|
6
|
-
import { P2SHPayment, Payment, PaymentOpts, PaymentType, ScriptRedeem, Stack, StackFunction } from './index.js';
|
|
7
|
-
import * as lazy from './lazy.js';
|
|
8
|
-
|
|
9
|
-
const OPS = bscript.
|
|
10
|
-
|
|
11
|
-
// input: [redeemScriptSig ...] {redeemScript}
|
|
12
|
-
// witness: <?>
|
|
13
|
-
// output: OP_HASH160 {hash160(redeemScript)} OP_EQUAL
|
|
14
|
-
/**
|
|
15
|
-
* Creates a Pay-to-Script-Hash (P2SH) payment object.
|
|
16
|
-
*
|
|
17
|
-
* @param a - The payment object containing the necessary data.
|
|
18
|
-
* @param opts - Optional payment options.
|
|
19
|
-
* @returns The P2SH payment object.
|
|
20
|
-
* @throws {TypeError} If the required data is not provided or if the data is invalid.
|
|
21
|
-
*/
|
|
22
|
-
export function p2sh(a: Omit<P2SHPayment, 'name'>, opts?: PaymentOpts): P2SHPayment {
|
|
23
|
-
if (!a.address && !a.hash && !a.output && !a.redeem && !a.input) {
|
|
24
|
-
throw new TypeError('Not enough data');
|
|
25
|
-
}
|
|
26
|
-
opts = Object.assign({ validate: true }, opts || {});
|
|
27
|
-
|
|
28
|
-
typef(
|
|
29
|
-
{
|
|
30
|
-
network: typef.maybe(typef.Object),
|
|
31
|
-
|
|
32
|
-
address: typef.maybe(typef.String),
|
|
33
|
-
hash: typef.maybe(typef.BufferN(20)),
|
|
34
|
-
output: typef.maybe(typef.BufferN(23)),
|
|
35
|
-
|
|
36
|
-
redeem: typef.maybe({
|
|
37
|
-
network: typef.maybe(typef.Object),
|
|
38
|
-
output: typef.maybe(typef.Buffer),
|
|
39
|
-
input: typef.maybe(typef.Buffer),
|
|
40
|
-
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
41
|
-
}),
|
|
42
|
-
input: typef.maybe(typef.Buffer),
|
|
43
|
-
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
44
|
-
},
|
|
45
|
-
a,
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
let network = a.network;
|
|
49
|
-
if (!network) {
|
|
50
|
-
network = (a.redeem && a.redeem.network) || BITCOIN_NETWORK;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const o: P2SHPayment = {
|
|
54
|
-
network,
|
|
55
|
-
name: PaymentType.P2SH
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const _address = lazy.value(() => {
|
|
59
|
-
const payload = Buffer.from(bs58check.default.decode(a.address!));
|
|
60
|
-
const version = payload.readUInt8(0);
|
|
61
|
-
const hash = payload.slice(1);
|
|
62
|
-
return { version, hash };
|
|
63
|
-
});
|
|
64
|
-
const _chunks = lazy.value(() => {
|
|
65
|
-
return bscript.decompile(a.input!);
|
|
66
|
-
}) as StackFunction;
|
|
67
|
-
|
|
68
|
-
const _redeem = lazy.value((): ScriptRedeem => {
|
|
69
|
-
const chunks = _chunks();
|
|
70
|
-
const lastChunk = chunks[chunks.length - 1];
|
|
71
|
-
return {
|
|
72
|
-
network,
|
|
73
|
-
output: lastChunk === OPS.OP_FALSE ? Buffer.from([]) : (lastChunk as Buffer),
|
|
74
|
-
input: bscript.compile(chunks.slice(0, -1)),
|
|
75
|
-
witness: a.witness || [],
|
|
76
|
-
};
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
// output dependents
|
|
80
|
-
lazy.prop(o, 'address', () => {
|
|
81
|
-
if (!o.hash) return;
|
|
82
|
-
|
|
83
|
-
const payload = Buffer.allocUnsafe(21);
|
|
84
|
-
payload.writeUInt8(o.network!.scriptHash, 0);
|
|
85
|
-
o.hash.copy(payload, 1);
|
|
86
|
-
return bs58check.default.encode(payload);
|
|
87
|
-
});
|
|
88
|
-
lazy.prop(o, 'hash', () => {
|
|
89
|
-
// in order of least effort
|
|
90
|
-
if (a.output) return a.output.slice(2, 22);
|
|
91
|
-
if (a.address) return _address().hash;
|
|
92
|
-
if (o.redeem && o.redeem.output) return bcrypto.hash160(o.redeem.output);
|
|
93
|
-
});
|
|
94
|
-
lazy.prop(o, 'output', () => {
|
|
95
|
-
if (!o.hash) return;
|
|
96
|
-
return bscript.compile([OPS.OP_HASH160, o.hash, OPS.OP_EQUAL]);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// input dependents
|
|
100
|
-
lazy.prop(o, 'redeem', () => {
|
|
101
|
-
if (!a.input) return;
|
|
102
|
-
return _redeem();
|
|
103
|
-
});
|
|
104
|
-
lazy.prop(o, 'input', () => {
|
|
105
|
-
if (!a.redeem || !a.redeem.input || !a.redeem.output) return;
|
|
106
|
-
return bscript.compile(
|
|
107
|
-
([] as Stack).concat(bscript.decompile(a.redeem.input) as Stack, a.redeem.output),
|
|
108
|
-
);
|
|
109
|
-
});
|
|
110
|
-
lazy.prop(o, 'witness', () => {
|
|
111
|
-
if (o.redeem && o.redeem.witness) return o.redeem.witness;
|
|
112
|
-
if (o.input) return [];
|
|
113
|
-
});
|
|
114
|
-
lazy.prop(o, 'name', () => {
|
|
115
|
-
const nameParts = ['p2sh'];
|
|
116
|
-
if (o.redeem !== undefined && o.redeem.name !== undefined) nameParts.push(o.redeem.name!);
|
|
117
|
-
return nameParts.join('-');
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
if (opts.validate) {
|
|
121
|
-
let hash: Buffer = Buffer.from([]);
|
|
122
|
-
if (a.address) {
|
|
123
|
-
if (_address().version !== network.scriptHash)
|
|
124
|
-
throw new TypeError('Invalid version or Network mismatch');
|
|
125
|
-
if (_address().hash.length !== 20) throw new TypeError('Invalid address');
|
|
126
|
-
hash = _address().hash;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if (a.hash) {
|
|
130
|
-
if (hash.length > 0 && !hash.equals(a.hash)) throw new TypeError('Hash mismatch');
|
|
131
|
-
else hash = a.hash;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (a.output) {
|
|
135
|
-
if (
|
|
136
|
-
a.output.length !== 23 ||
|
|
137
|
-
a.output[0] !== OPS.OP_HASH160 ||
|
|
138
|
-
a.output[1] !== 0x14 ||
|
|
139
|
-
a.output[22] !== OPS.OP_EQUAL
|
|
140
|
-
)
|
|
141
|
-
throw new TypeError('Output is invalid');
|
|
142
|
-
|
|
143
|
-
const hash2 = a.output.slice(2, 22);
|
|
144
|
-
if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
|
|
145
|
-
else hash = hash2;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// inlined to prevent 'no-inner-declarations' failing
|
|
149
|
-
const checkRedeem = (redeem: Payment): void => {
|
|
150
|
-
// is the redeem output empty/invalid?
|
|
151
|
-
if (redeem.output) {
|
|
152
|
-
const decompile = bscript.decompile(redeem.output);
|
|
153
|
-
if (!decompile || decompile.length < 1)
|
|
154
|
-
throw new TypeError('Redeem.output too short');
|
|
155
|
-
if (redeem.output.byteLength > 520)
|
|
156
|
-
throw new TypeError('Redeem.output unspendable if larger than 520 bytes');
|
|
157
|
-
if (bscript.countNonPushOnlyOPs(decompile) > 201)
|
|
158
|
-
throw new TypeError(
|
|
159
|
-
'Redeem.output unspendable with more than 201 non-push ops',
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
// match hash against other sources
|
|
163
|
-
const hash2 = bcrypto.hash160(redeem.output);
|
|
164
|
-
if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
|
|
165
|
-
else hash = hash2;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (redeem.input) {
|
|
169
|
-
const hasInput = redeem.input.length > 0;
|
|
170
|
-
const hasWitness = redeem.witness && redeem.witness.length > 0;
|
|
171
|
-
if (!hasInput && !hasWitness) throw new TypeError('Empty input');
|
|
172
|
-
if (hasInput && hasWitness) throw new TypeError('Input and witness provided');
|
|
173
|
-
if (hasInput) {
|
|
174
|
-
const richunks = bscript.decompile(redeem.input) as Stack;
|
|
175
|
-
if (!bscript.isPushOnly(richunks))
|
|
176
|
-
throw new TypeError('Non push-only scriptSig');
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
if (a.input) {
|
|
182
|
-
const chunks = _chunks();
|
|
183
|
-
if (!chunks || chunks.length < 1) throw new TypeError('Input too short');
|
|
184
|
-
if (!Buffer.isBuffer(_redeem().output)) throw new TypeError('Input is invalid');
|
|
185
|
-
|
|
186
|
-
checkRedeem(_redeem());
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
if (a.redeem) {
|
|
190
|
-
if (a.redeem.network && a.redeem.network !== network)
|
|
191
|
-
throw new TypeError('Network mismatch');
|
|
192
|
-
if (a.input) {
|
|
193
|
-
const redeem = _redeem();
|
|
194
|
-
if (a.redeem.output && !a.redeem.output.equals(redeem.output!))
|
|
195
|
-
throw new TypeError('Redeem.output mismatch');
|
|
196
|
-
if (a.redeem.input && !a.redeem.input.equals(redeem.input!))
|
|
197
|
-
throw new TypeError('Redeem.input mismatch');
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
checkRedeem(a.redeem);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (a.witness) {
|
|
204
|
-
if (a.redeem && a.redeem.witness && !stacksEqual(a.redeem.witness, a.witness))
|
|
205
|
-
throw new TypeError('Witness and redeem.witness mismatch');
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
return Object.assign(o, a);
|
|
210
|
-
}
|
|
1
|
+
import * as bs58check from 'bs58check';
|
|
2
|
+
import * as bcrypto from '../crypto.js';
|
|
3
|
+
import { bitcoin as BITCOIN_NETWORK } from '../networks.js';
|
|
4
|
+
import * as bscript from '../script.js';
|
|
5
|
+
import { stacksEqual, typeforce as typef } from '../types.js';
|
|
6
|
+
import { P2SHPayment, Payment, PaymentOpts, PaymentType, ScriptRedeem, Stack, StackFunction, } from './index.js';
|
|
7
|
+
import * as lazy from './lazy.js';
|
|
8
|
+
|
|
9
|
+
const OPS = bscript.opcodes;
|
|
10
|
+
|
|
11
|
+
// input: [redeemScriptSig ...] {redeemScript}
|
|
12
|
+
// witness: <?>
|
|
13
|
+
// output: OP_HASH160 {hash160(redeemScript)} OP_EQUAL
|
|
14
|
+
/**
|
|
15
|
+
* Creates a Pay-to-Script-Hash (P2SH) payment object.
|
|
16
|
+
*
|
|
17
|
+
* @param a - The payment object containing the necessary data.
|
|
18
|
+
* @param opts - Optional payment options.
|
|
19
|
+
* @returns The P2SH payment object.
|
|
20
|
+
* @throws {TypeError} If the required data is not provided or if the data is invalid.
|
|
21
|
+
*/
|
|
22
|
+
export function p2sh(a: Omit<P2SHPayment, 'name'>, opts?: PaymentOpts): P2SHPayment {
|
|
23
|
+
if (!a.address && !a.hash && !a.output && !a.redeem && !a.input) {
|
|
24
|
+
throw new TypeError('Not enough data');
|
|
25
|
+
}
|
|
26
|
+
opts = Object.assign({ validate: true }, opts || {});
|
|
27
|
+
|
|
28
|
+
typef(
|
|
29
|
+
{
|
|
30
|
+
network: typef.maybe(typef.Object),
|
|
31
|
+
|
|
32
|
+
address: typef.maybe(typef.String),
|
|
33
|
+
hash: typef.maybe(typef.BufferN(20)),
|
|
34
|
+
output: typef.maybe(typef.BufferN(23)),
|
|
35
|
+
|
|
36
|
+
redeem: typef.maybe({
|
|
37
|
+
network: typef.maybe(typef.Object),
|
|
38
|
+
output: typef.maybe(typef.Buffer),
|
|
39
|
+
input: typef.maybe(typef.Buffer),
|
|
40
|
+
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
41
|
+
}),
|
|
42
|
+
input: typef.maybe(typef.Buffer),
|
|
43
|
+
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
44
|
+
},
|
|
45
|
+
a,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
let network = a.network;
|
|
49
|
+
if (!network) {
|
|
50
|
+
network = (a.redeem && a.redeem.network) || BITCOIN_NETWORK;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const o: P2SHPayment = {
|
|
54
|
+
network,
|
|
55
|
+
name: PaymentType.P2SH,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const _address = lazy.value(() => {
|
|
59
|
+
const payload = Buffer.from(bs58check.default.decode(a.address!));
|
|
60
|
+
const version = payload.readUInt8(0);
|
|
61
|
+
const hash = payload.slice(1);
|
|
62
|
+
return { version, hash };
|
|
63
|
+
});
|
|
64
|
+
const _chunks = lazy.value(() => {
|
|
65
|
+
return bscript.decompile(a.input!);
|
|
66
|
+
}) as StackFunction;
|
|
67
|
+
|
|
68
|
+
const _redeem = lazy.value((): ScriptRedeem => {
|
|
69
|
+
const chunks = _chunks();
|
|
70
|
+
const lastChunk = chunks[chunks.length - 1];
|
|
71
|
+
return {
|
|
72
|
+
network,
|
|
73
|
+
output: lastChunk === OPS.OP_FALSE ? Buffer.from([]) : (lastChunk as Buffer),
|
|
74
|
+
input: bscript.compile(chunks.slice(0, -1)),
|
|
75
|
+
witness: a.witness || [],
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// output dependents
|
|
80
|
+
lazy.prop(o, 'address', () => {
|
|
81
|
+
if (!o.hash) return;
|
|
82
|
+
|
|
83
|
+
const payload = Buffer.allocUnsafe(21);
|
|
84
|
+
payload.writeUInt8(o.network!.scriptHash, 0);
|
|
85
|
+
o.hash.copy(payload, 1);
|
|
86
|
+
return bs58check.default.encode(payload);
|
|
87
|
+
});
|
|
88
|
+
lazy.prop(o, 'hash', () => {
|
|
89
|
+
// in order of least effort
|
|
90
|
+
if (a.output) return a.output.slice(2, 22);
|
|
91
|
+
if (a.address) return _address().hash;
|
|
92
|
+
if (o.redeem && o.redeem.output) return bcrypto.hash160(o.redeem.output);
|
|
93
|
+
});
|
|
94
|
+
lazy.prop(o, 'output', () => {
|
|
95
|
+
if (!o.hash) return;
|
|
96
|
+
return bscript.compile([OPS.OP_HASH160, o.hash, OPS.OP_EQUAL]);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// input dependents
|
|
100
|
+
lazy.prop(o, 'redeem', () => {
|
|
101
|
+
if (!a.input) return;
|
|
102
|
+
return _redeem();
|
|
103
|
+
});
|
|
104
|
+
lazy.prop(o, 'input', () => {
|
|
105
|
+
if (!a.redeem || !a.redeem.input || !a.redeem.output) return;
|
|
106
|
+
return bscript.compile(
|
|
107
|
+
([] as Stack).concat(bscript.decompile(a.redeem.input) as Stack, a.redeem.output),
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
lazy.prop(o, 'witness', () => {
|
|
111
|
+
if (o.redeem && o.redeem.witness) return o.redeem.witness;
|
|
112
|
+
if (o.input) return [];
|
|
113
|
+
});
|
|
114
|
+
lazy.prop(o, 'name', () => {
|
|
115
|
+
const nameParts = ['p2sh'];
|
|
116
|
+
if (o.redeem !== undefined && o.redeem.name !== undefined) nameParts.push(o.redeem.name!);
|
|
117
|
+
return nameParts.join('-');
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
if (opts.validate) {
|
|
121
|
+
let hash: Buffer = Buffer.from([]);
|
|
122
|
+
if (a.address) {
|
|
123
|
+
if (_address().version !== network.scriptHash)
|
|
124
|
+
throw new TypeError('Invalid version or Network mismatch');
|
|
125
|
+
if (_address().hash.length !== 20) throw new TypeError('Invalid address');
|
|
126
|
+
hash = _address().hash;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (a.hash) {
|
|
130
|
+
if (hash.length > 0 && !hash.equals(a.hash)) throw new TypeError('Hash mismatch');
|
|
131
|
+
else hash = a.hash;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (a.output) {
|
|
135
|
+
if (
|
|
136
|
+
a.output.length !== 23 ||
|
|
137
|
+
a.output[0] !== OPS.OP_HASH160 ||
|
|
138
|
+
a.output[1] !== 0x14 ||
|
|
139
|
+
a.output[22] !== OPS.OP_EQUAL
|
|
140
|
+
)
|
|
141
|
+
throw new TypeError('Output is invalid');
|
|
142
|
+
|
|
143
|
+
const hash2 = a.output.slice(2, 22);
|
|
144
|
+
if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
|
|
145
|
+
else hash = hash2;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// inlined to prevent 'no-inner-declarations' failing
|
|
149
|
+
const checkRedeem = (redeem: Payment): void => {
|
|
150
|
+
// is the redeem output empty/invalid?
|
|
151
|
+
if (redeem.output) {
|
|
152
|
+
const decompile = bscript.decompile(redeem.output);
|
|
153
|
+
if (!decompile || decompile.length < 1)
|
|
154
|
+
throw new TypeError('Redeem.output too short');
|
|
155
|
+
if (redeem.output.byteLength > 520)
|
|
156
|
+
throw new TypeError('Redeem.output unspendable if larger than 520 bytes');
|
|
157
|
+
if (bscript.countNonPushOnlyOPs(decompile) > 201)
|
|
158
|
+
throw new TypeError(
|
|
159
|
+
'Redeem.output unspendable with more than 201 non-push ops',
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
// match hash against other sources
|
|
163
|
+
const hash2 = bcrypto.hash160(redeem.output);
|
|
164
|
+
if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
|
|
165
|
+
else hash = hash2;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (redeem.input) {
|
|
169
|
+
const hasInput = redeem.input.length > 0;
|
|
170
|
+
const hasWitness = redeem.witness && redeem.witness.length > 0;
|
|
171
|
+
if (!hasInput && !hasWitness) throw new TypeError('Empty input');
|
|
172
|
+
if (hasInput && hasWitness) throw new TypeError('Input and witness provided');
|
|
173
|
+
if (hasInput) {
|
|
174
|
+
const richunks = bscript.decompile(redeem.input) as Stack;
|
|
175
|
+
if (!bscript.isPushOnly(richunks))
|
|
176
|
+
throw new TypeError('Non push-only scriptSig');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
if (a.input) {
|
|
182
|
+
const chunks = _chunks();
|
|
183
|
+
if (!chunks || chunks.length < 1) throw new TypeError('Input too short');
|
|
184
|
+
if (!Buffer.isBuffer(_redeem().output)) throw new TypeError('Input is invalid');
|
|
185
|
+
|
|
186
|
+
checkRedeem(_redeem());
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (a.redeem) {
|
|
190
|
+
if (a.redeem.network && a.redeem.network !== network)
|
|
191
|
+
throw new TypeError('Network mismatch');
|
|
192
|
+
if (a.input) {
|
|
193
|
+
const redeem = _redeem();
|
|
194
|
+
if (a.redeem.output && !a.redeem.output.equals(redeem.output!))
|
|
195
|
+
throw new TypeError('Redeem.output mismatch');
|
|
196
|
+
if (a.redeem.input && !a.redeem.input.equals(redeem.input!))
|
|
197
|
+
throw new TypeError('Redeem.input mismatch');
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
checkRedeem(a.redeem);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (a.witness) {
|
|
204
|
+
if (a.redeem && a.redeem.witness && !stacksEqual(a.redeem.witness, a.witness))
|
|
205
|
+
throw new TypeError('Witness and redeem.witness mismatch');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return Object.assign(o, a);
|
|
210
|
+
}
|