@btc-vision/bitcoin 6.3.1 → 6.3.2
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 -0
- package/.gitattributes +2 -0
- package/.nyc_output/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
- package/.nyc_output/processinfo/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -0
- package/.prettierrc.json +12 -0
- package/CHANGELOG.md +403 -0
- package/CONTRIBUTING.md +83 -0
- package/browser/address.d.ts +16 -0
- package/{src → browser}/bip66.d.ts +6 -7
- package/{src → browser}/block.d.ts +29 -30
- package/{src → browser}/bufferutils.d.ts +34 -54
- package/browser/crypto/crypto.d.ts +1 -0
- package/{src → browser}/crypto.d.ts +13 -18
- package/browser/ecc_lib.d.ts +3 -0
- package/browser/hooks/AdvancedSignatureManager.d.ts +16 -0
- package/{src → browser}/hooks/HookedSigner.d.ts +4 -4
- package/browser/hooks/SignatureManager.d.ts +13 -0
- package/browser/index.d.ts +58 -0
- package/browser/index.js +2 -0
- package/browser/index.js.LICENSE.txt +14 -0
- package/browser/merkle.d.ts +1 -0
- package/browser/networks.d.ts +23 -0
- package/{src → browser}/ops.d.ts +126 -126
- package/browser/payments/bip341.d.ts +23 -0
- package/browser/payments/embed.d.ts +2 -0
- package/browser/payments/index.d.ts +41 -0
- package/{src → browser}/payments/lazy.d.ts +2 -2
- package/browser/payments/p2ms.d.ts +2 -0
- package/browser/payments/p2pk.d.ts +2 -0
- package/browser/payments/p2pkh.d.ts +2 -0
- package/browser/payments/p2sh.d.ts +2 -0
- package/browser/payments/p2tr.d.ts +2 -0
- package/browser/payments/p2wpkh.d.ts +2 -0
- package/browser/payments/p2wsh.d.ts +2 -0
- package/browser/psbt/bip371.d.ts +16 -0
- package/browser/psbt/psbtutils.d.ts +26 -0
- package/{src → browser}/psbt.d.ts +167 -238
- package/browser/push_data.d.ts +7 -0
- package/browser/script.d.ts +17 -0
- package/browser/script_number.d.ts +2 -0
- package/browser/script_signature.d.ts +7 -0
- package/{src → browser}/transaction.d.ts +48 -60
- package/{src → browser}/types.d.ts +37 -54
- package/build/address.d.ts +16 -0
- package/build/address.js +148 -0
- package/build/bip66.d.ts +6 -0
- package/build/bip66.js +99 -0
- package/build/block.d.ts +29 -0
- package/build/block.js +181 -0
- package/build/bufferutils.d.ts +34 -0
- package/build/bufferutils.js +141 -0
- package/build/crypto/crypto.d.ts +1 -0
- package/build/crypto/crypto.js +1 -0
- package/build/crypto.d.ts +13 -0
- package/build/crypto.js +87 -0
- package/build/ecc_lib.d.ts +3 -0
- package/build/ecc_lib.js +61 -0
- package/build/hooks/AdvancedSignatureManager.d.ts +16 -0
- package/build/hooks/AdvancedSignatureManager.js +52 -0
- package/build/hooks/HookedSigner.d.ts +4 -0
- package/build/hooks/HookedSigner.js +64 -0
- package/build/hooks/SignatureManager.d.ts +13 -0
- package/build/hooks/SignatureManager.js +45 -0
- package/build/index.d.ts +58 -0
- package/build/index.js +32 -0
- package/build/merkle.d.ts +1 -0
- package/build/merkle.js +19 -0
- package/build/networks.d.ts +23 -0
- package/build/networks.js +121 -0
- package/build/ops.d.ts +126 -0
- package/{src → build}/ops.js +127 -131
- package/build/payments/bip341.d.ts +23 -0
- package/build/payments/bip341.js +82 -0
- package/build/payments/embed.d.ts +2 -0
- package/build/payments/embed.js +39 -0
- package/build/payments/index.d.ts +41 -0
- package/build/payments/index.js +10 -0
- package/build/payments/lazy.d.ts +2 -0
- package/{src → build}/payments/lazy.js +28 -32
- package/build/payments/p2ms.d.ts +2 -0
- package/{src → build}/payments/p2ms.js +128 -158
- package/build/payments/p2pk.d.ts +2 -0
- package/build/payments/p2pk.js +68 -0
- package/build/payments/p2pkh.d.ts +2 -0
- package/build/payments/p2pkh.js +135 -0
- package/build/payments/p2sh.d.ts +2 -0
- package/build/payments/p2sh.js +175 -0
- package/build/payments/p2tr.d.ts +2 -0
- package/build/payments/p2tr.js +254 -0
- package/build/payments/p2wpkh.d.ts +2 -0
- package/build/payments/p2wpkh.js +130 -0
- package/build/payments/p2wsh.d.ts +2 -0
- package/build/payments/p2wsh.js +180 -0
- package/build/psbt/bip371.d.ts +16 -0
- package/build/psbt/bip371.js +246 -0
- package/build/psbt/psbtutils.d.ts +26 -0
- package/build/psbt/psbtutils.js +170 -0
- package/build/psbt.d.ts +167 -0
- package/build/psbt.js +1305 -0
- package/build/push_data.d.ts +7 -0
- package/build/push_data.js +57 -0
- package/build/script.d.ts +17 -0
- package/build/script.js +167 -0
- package/build/script_number.d.ts +2 -0
- package/build/script_number.js +49 -0
- package/build/script_signature.d.ts +7 -0
- package/build/script_signature.js +49 -0
- package/build/transaction.d.ts +48 -0
- package/build/transaction.js +445 -0
- package/build/types.d.ts +37 -0
- package/build/types.js +73 -0
- package/cjs/package.json +3 -0
- package/eslint.config.js +56 -0
- package/gulpfile.js +42 -0
- package/package.json +105 -50
- package/src/{address.js → address.ts} +93 -73
- package/src/{bip66.js → bip66.ts} +23 -19
- package/src/{block.js → block.ts} +114 -105
- package/src/{bufferutils.js → bufferutils.ts} +65 -67
- package/src/crypto/crypto-browser.js +75 -0
- package/src/crypto/crypto.ts +1 -0
- package/src/crypto.ts +108 -0
- package/src/{ecc_lib.js → ecc_lib.ts} +25 -53
- package/src/hooks/{AdvancedSignatureManager.js → AdvancedSignatureManager.ts} +34 -18
- package/src/hooks/HookedSigner.ts +108 -0
- package/src/hooks/{SignatureManager.js → SignatureManager.ts} +26 -14
- package/src/index.ts +86 -0
- package/src/{merkle.js → merkle.ts} +8 -7
- package/src/{networks.js → networks.ts} +44 -29
- package/src/ops.ts +282 -0
- package/src/payments/bip341.ts +140 -0
- package/src/payments/embed.ts +55 -0
- package/src/payments/{index.d.ts → index.ts} +20 -10
- package/src/payments/lazy.ts +28 -0
- package/src/payments/p2ms.ts +150 -0
- package/src/payments/{p2pk.js → p2pk.ts} +32 -29
- package/src/payments/{p2pkh.js → p2pkh.ts} +53 -47
- package/src/payments/{p2sh.js → p2sh.ts} +72 -71
- package/src/payments/{p2tr.js → p2tr.ts} +114 -125
- package/src/payments/{p2wpkh.js → p2wpkh.ts} +51 -56
- package/src/payments/{p2wsh.js → p2wsh.ts} +69 -81
- package/src/psbt/{bip371.js → bip371.ts} +191 -174
- package/src/psbt/psbtutils.ts +299 -0
- package/src/{psbt.js → psbt.ts} +1025 -679
- package/src/{push_data.js → push_data.ts} +35 -21
- package/src/{script.js → script.ts} +93 -77
- package/src/{script_number.js → script_number.ts} +15 -21
- package/src/{script_signature.js → script_signature.ts} +26 -14
- package/src/{transaction.js → transaction.ts} +247 -167
- package/src/types.ts +122 -0
- package/test/address.spec.js +124 -0
- package/test/address.spec.ts +177 -0
- package/test/bitcoin.core.spec.js +170 -0
- package/test/bitcoin.core.spec.ts +234 -0
- package/test/block.spec.js +141 -0
- package/test/block.spec.ts +194 -0
- package/test/bufferutils.spec.js +427 -0
- package/test/bufferutils.spec.ts +513 -0
- package/test/crypto.spec.js +41 -0
- package/test/crypto.spec.ts +55 -0
- package/test/fixtures/address.json +329 -0
- package/test/fixtures/block.json +148 -0
- package/test/fixtures/bufferutils.json +102 -0
- package/test/fixtures/core/README.md +26 -0
- package/test/fixtures/core/base58_encode_decode.json +50 -0
- package/test/fixtures/core/base58_keys_invalid.json +152 -0
- package/test/fixtures/core/base58_keys_valid.json +452 -0
- package/test/fixtures/core/blocks.json +27 -0
- package/test/fixtures/core/sig_canonical.json +7 -0
- package/test/fixtures/core/sig_noncanonical.json +33 -0
- package/test/fixtures/core/sighash.json +3505 -0
- package/test/fixtures/core/tx_valid.json +2023 -0
- package/test/fixtures/crypto.json +43 -0
- package/test/fixtures/ecdsa.json +217 -0
- package/test/fixtures/ecpair.json +141 -0
- package/test/fixtures/embed.json +108 -0
- package/test/fixtures/p2ms.json +434 -0
- package/test/fixtures/p2pk.json +179 -0
- package/test/fixtures/p2pkh.json +276 -0
- package/test/fixtures/p2sh.json +508 -0
- package/test/fixtures/p2tr.json +1198 -0
- package/test/fixtures/p2wpkh.json +290 -0
- package/test/fixtures/p2wsh.json +489 -0
- package/test/fixtures/psbt.json +924 -0
- package/test/fixtures/script.json +465 -0
- package/test/fixtures/script_number.json +225 -0
- package/test/fixtures/signature.json +140 -0
- package/test/fixtures/transaction.json +916 -0
- package/test/integration/_regtest.js +7 -0
- package/test/integration/_regtest.ts +6 -0
- package/test/integration/addresses.spec.js +116 -0
- package/test/integration/addresses.spec.ts +154 -0
- package/test/integration/bip32.spec.js +85 -0
- package/test/integration/bip32.spec.ts +151 -0
- package/test/integration/blocks.spec.js +26 -0
- package/test/integration/blocks.spec.ts +28 -0
- package/test/integration/cltv.spec.js +199 -0
- package/test/integration/cltv.spec.ts +283 -0
- package/test/integration/csv.spec.js +362 -0
- package/test/integration/csv.spec.ts +527 -0
- package/test/integration/payments.spec.js +98 -0
- package/test/integration/payments.spec.ts +135 -0
- package/test/integration/taproot.spec.js +532 -0
- package/test/integration/taproot.spec.ts +707 -0
- package/test/integration/transactions.spec.js +561 -0
- package/test/integration/transactions.spec.ts +769 -0
- package/test/payments.spec.js +97 -0
- package/test/payments.spec.ts +125 -0
- package/test/payments.utils.js +190 -0
- package/test/payments.utils.ts +208 -0
- package/test/psbt.spec.js +1044 -0
- package/test/psbt.spec.ts +1414 -0
- package/test/script.spec.js +151 -0
- package/test/script.spec.ts +210 -0
- package/test/script_number.spec.js +24 -0
- package/test/script_number.spec.ts +29 -0
- package/test/script_signature.spec.js +52 -0
- package/test/script_signature.spec.ts +66 -0
- package/test/transaction.spec.js +269 -0
- package/test/transaction.spec.ts +387 -0
- package/test/ts-node-register.js +5 -0
- package/test/tsconfig.json +45 -0
- package/test/types.spec.js +46 -0
- package/test/types.spec.ts +58 -0
- package/tsconfig.base.json +27 -0
- package/tsconfig.json +19 -0
- package/tsconfig.webpack.json +18 -0
- package/webpack.config.js +79 -0
- package/src/address.d.ts +0 -42
- package/src/crypto.js +0 -128
- package/src/ecc_lib.d.ts +0 -17
- package/src/hooks/AdvancedSignatureManager.d.ts +0 -44
- package/src/hooks/HookedSigner.js +0 -90
- package/src/hooks/SignatureManager.d.ts +0 -35
- package/src/index.d.ts +0 -42
- package/src/index.js +0 -87
- package/src/merkle.d.ts +0 -10
- package/src/networks.d.ts +0 -83
- package/src/payments/bip341.d.ts +0 -49
- package/src/payments/bip341.js +0 -124
- package/src/payments/embed.d.ts +0 -9
- package/src/payments/embed.js +0 -54
- package/src/payments/index.js +0 -69
- package/src/payments/p2ms.d.ts +0 -9
- package/src/payments/p2pk.d.ts +0 -10
- package/src/payments/p2pkh.d.ts +0 -10
- package/src/payments/p2sh.d.ts +0 -10
- package/src/payments/p2tr.d.ts +0 -10
- package/src/payments/p2wpkh.d.ts +0 -10
- package/src/payments/p2wsh.d.ts +0 -10
- package/src/psbt/bip371.d.ts +0 -42
- package/src/psbt/psbtutils.d.ts +0 -64
- package/src/psbt/psbtutils.js +0 -191
- package/src/push_data.d.ts +0 -29
- package/src/script.d.ts +0 -42
- package/src/script_number.d.ts +0 -19
- package/src/script_signature.d.ts +0 -21
- package/src/types.js +0 -106
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const bs58check = require('bs58check');
|
|
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 { Payment, PaymentFunction, PaymentOpts, Stack, StackFunction } from './index.js';
|
|
7
|
+
import * as lazy from './lazy.js';
|
|
8
|
+
|
|
10
9
|
const OPS = bscript.OPS;
|
|
10
|
+
|
|
11
11
|
// input: [redeemScriptSig ...] {redeemScript}
|
|
12
12
|
// witness: <?>
|
|
13
13
|
// output: OP_HASH160 {hash160(redeemScript)} OP_EQUAL
|
|
@@ -19,74 +19,78 @@ const OPS = bscript.OPS;
|
|
|
19
19
|
* @returns The P2SH payment object.
|
|
20
20
|
* @throws {TypeError} If the required data is not provided or if the data is invalid.
|
|
21
21
|
*/
|
|
22
|
-
function p2sh(a, opts) {
|
|
22
|
+
export function p2sh(a: Payment, opts?: PaymentOpts): Payment {
|
|
23
23
|
if (!a.address && !a.hash && !a.output && !a.redeem && !a.input)
|
|
24
24
|
throw new TypeError('Not enough data');
|
|
25
25
|
opts = Object.assign({ validate: true }, opts || {});
|
|
26
|
-
|
|
26
|
+
|
|
27
|
+
typef(
|
|
27
28
|
{
|
|
28
|
-
network:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
),
|
|
29
|
+
network: typef.maybe(typef.Object),
|
|
30
|
+
|
|
31
|
+
address: typef.maybe(typef.String),
|
|
32
|
+
hash: typef.maybe(typef.BufferN(20)),
|
|
33
|
+
output: typef.maybe(typef.BufferN(23)),
|
|
34
|
+
|
|
35
|
+
redeem: typef.maybe({
|
|
36
|
+
network: typef.maybe(typef.Object),
|
|
37
|
+
output: typef.maybe(typef.Buffer),
|
|
38
|
+
input: typef.maybe(typef.Buffer),
|
|
39
|
+
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
39
40
|
}),
|
|
40
|
-
input:
|
|
41
|
-
witness:
|
|
42
|
-
types_1.typeforce.arrayOf(types_1.typeforce.Buffer),
|
|
43
|
-
),
|
|
41
|
+
input: typef.maybe(typef.Buffer),
|
|
42
|
+
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
44
43
|
},
|
|
45
44
|
a,
|
|
46
45
|
);
|
|
46
|
+
|
|
47
47
|
let network = a.network;
|
|
48
48
|
if (!network) {
|
|
49
|
-
network = (a.redeem && a.redeem.network) ||
|
|
49
|
+
network = (a.redeem && a.redeem.network) || BITCOIN_NETWORK;
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
|
|
52
|
+
const o: Payment = { network };
|
|
53
|
+
|
|
52
54
|
const _address = lazy.value(() => {
|
|
53
|
-
const payload = Buffer.from(bs58check.decode(a.address));
|
|
55
|
+
const payload = Buffer.from(bs58check.default.decode(a.address!));
|
|
54
56
|
const version = payload.readUInt8(0);
|
|
55
57
|
const hash = payload.slice(1);
|
|
56
58
|
return { version, hash };
|
|
57
59
|
});
|
|
58
60
|
const _chunks = lazy.value(() => {
|
|
59
|
-
return bscript.decompile(a.input);
|
|
60
|
-
});
|
|
61
|
-
const _redeem = lazy.value(() => {
|
|
61
|
+
return bscript.decompile(a.input!);
|
|
62
|
+
}) as StackFunction;
|
|
63
|
+
const _redeem = lazy.value((): Payment => {
|
|
62
64
|
const chunks = _chunks();
|
|
63
65
|
const lastChunk = chunks[chunks.length - 1];
|
|
64
66
|
return {
|
|
65
67
|
network,
|
|
66
|
-
output: lastChunk === OPS.OP_FALSE ? Buffer.from([]) : lastChunk,
|
|
68
|
+
output: lastChunk === OPS.OP_FALSE ? Buffer.from([]) : (lastChunk as Buffer),
|
|
67
69
|
input: bscript.compile(chunks.slice(0, -1)),
|
|
68
70
|
witness: a.witness || [],
|
|
69
71
|
};
|
|
70
|
-
});
|
|
72
|
+
}) as PaymentFunction;
|
|
73
|
+
|
|
71
74
|
// output dependents
|
|
72
75
|
lazy.prop(o, 'address', () => {
|
|
73
76
|
if (!o.hash) return;
|
|
77
|
+
|
|
74
78
|
const payload = Buffer.allocUnsafe(21);
|
|
75
|
-
payload.writeUInt8(o.network
|
|
79
|
+
payload.writeUInt8(o.network!.scriptHash, 0);
|
|
76
80
|
o.hash.copy(payload, 1);
|
|
77
|
-
return bs58check.encode(payload);
|
|
81
|
+
return bs58check.default.encode(payload);
|
|
78
82
|
});
|
|
79
83
|
lazy.prop(o, 'hash', () => {
|
|
80
84
|
// in order of least effort
|
|
81
85
|
if (a.output) return a.output.slice(2, 22);
|
|
82
86
|
if (a.address) return _address().hash;
|
|
83
|
-
if (o.redeem && o.redeem.output)
|
|
84
|
-
return bcrypto.hash160(o.redeem.output);
|
|
87
|
+
if (o.redeem && o.redeem.output) return bcrypto.hash160(o.redeem.output);
|
|
85
88
|
});
|
|
86
89
|
lazy.prop(o, 'output', () => {
|
|
87
90
|
if (!o.hash) return;
|
|
88
91
|
return bscript.compile([OPS.OP_HASH160, o.hash, OPS.OP_EQUAL]);
|
|
89
92
|
});
|
|
93
|
+
|
|
90
94
|
// input dependents
|
|
91
95
|
lazy.prop(o, 'redeem', () => {
|
|
92
96
|
if (!a.input) return;
|
|
@@ -95,7 +99,7 @@ function p2sh(a, opts) {
|
|
|
95
99
|
lazy.prop(o, 'input', () => {
|
|
96
100
|
if (!a.redeem || !a.redeem.input || !a.redeem.output) return;
|
|
97
101
|
return bscript.compile(
|
|
98
|
-
[].concat(bscript.decompile(a.redeem.input), a.redeem.output),
|
|
102
|
+
([] as Stack).concat(bscript.decompile(a.redeem.input) as Stack, a.redeem.output),
|
|
99
103
|
);
|
|
100
104
|
});
|
|
101
105
|
lazy.prop(o, 'witness', () => {
|
|
@@ -104,24 +108,24 @@ function p2sh(a, opts) {
|
|
|
104
108
|
});
|
|
105
109
|
lazy.prop(o, 'name', () => {
|
|
106
110
|
const nameParts = ['p2sh'];
|
|
107
|
-
if (o.redeem !== undefined && o.redeem.name !== undefined)
|
|
108
|
-
nameParts.push(o.redeem.name);
|
|
111
|
+
if (o.redeem !== undefined && o.redeem.name !== undefined) nameParts.push(o.redeem.name!);
|
|
109
112
|
return nameParts.join('-');
|
|
110
113
|
});
|
|
114
|
+
|
|
111
115
|
if (opts.validate) {
|
|
112
|
-
let hash = Buffer.from([]);
|
|
116
|
+
let hash: Buffer = Buffer.from([]);
|
|
113
117
|
if (a.address) {
|
|
114
118
|
if (_address().version !== network.scriptHash)
|
|
115
119
|
throw new TypeError('Invalid version or Network mismatch');
|
|
116
|
-
if (_address().hash.length !== 20)
|
|
117
|
-
throw new TypeError('Invalid address');
|
|
120
|
+
if (_address().hash.length !== 20) throw new TypeError('Invalid address');
|
|
118
121
|
hash = _address().hash;
|
|
119
122
|
}
|
|
123
|
+
|
|
120
124
|
if (a.hash) {
|
|
121
|
-
if (hash.length > 0 && !hash.equals(a.hash))
|
|
122
|
-
throw new TypeError('Hash mismatch');
|
|
125
|
+
if (hash.length > 0 && !hash.equals(a.hash)) throw new TypeError('Hash mismatch');
|
|
123
126
|
else hash = a.hash;
|
|
124
127
|
}
|
|
128
|
+
|
|
125
129
|
if (a.output) {
|
|
126
130
|
if (
|
|
127
131
|
a.output.length !== 23 ||
|
|
@@ -130,75 +134,72 @@ function p2sh(a, opts) {
|
|
|
130
134
|
a.output[22] !== OPS.OP_EQUAL
|
|
131
135
|
)
|
|
132
136
|
throw new TypeError('Output is invalid');
|
|
137
|
+
|
|
133
138
|
const hash2 = a.output.slice(2, 22);
|
|
134
|
-
if (hash.length > 0 && !hash.equals(hash2))
|
|
135
|
-
throw new TypeError('Hash mismatch');
|
|
139
|
+
if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
|
|
136
140
|
else hash = hash2;
|
|
137
141
|
}
|
|
142
|
+
|
|
138
143
|
// inlined to prevent 'no-inner-declarations' failing
|
|
139
|
-
const checkRedeem = redeem => {
|
|
144
|
+
const checkRedeem = (redeem: Payment): void => {
|
|
140
145
|
// is the redeem output empty/invalid?
|
|
141
146
|
if (redeem.output) {
|
|
142
147
|
const decompile = bscript.decompile(redeem.output);
|
|
143
148
|
if (!decompile || decompile.length < 1)
|
|
144
149
|
throw new TypeError('Redeem.output too short');
|
|
145
150
|
if (redeem.output.byteLength > 520)
|
|
146
|
-
throw new TypeError(
|
|
147
|
-
'Redeem.output unspendable if larger than 520 bytes',
|
|
148
|
-
);
|
|
151
|
+
throw new TypeError('Redeem.output unspendable if larger than 520 bytes');
|
|
149
152
|
if (bscript.countNonPushOnlyOPs(decompile) > 201)
|
|
150
153
|
throw new TypeError(
|
|
151
154
|
'Redeem.output unspendable with more than 201 non-push ops',
|
|
152
155
|
);
|
|
156
|
+
|
|
153
157
|
// match hash against other sources
|
|
154
158
|
const hash2 = bcrypto.hash160(redeem.output);
|
|
155
|
-
if (hash.length > 0 && !hash.equals(hash2))
|
|
156
|
-
throw new TypeError('Hash mismatch');
|
|
159
|
+
if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
|
|
157
160
|
else hash = hash2;
|
|
158
161
|
}
|
|
162
|
+
|
|
159
163
|
if (redeem.input) {
|
|
160
164
|
const hasInput = redeem.input.length > 0;
|
|
161
165
|
const hasWitness = redeem.witness && redeem.witness.length > 0;
|
|
162
|
-
if (!hasInput && !hasWitness)
|
|
163
|
-
|
|
164
|
-
if (hasInput && hasWitness)
|
|
165
|
-
throw new TypeError('Input and witness provided');
|
|
166
|
+
if (!hasInput && !hasWitness) throw new TypeError('Empty input');
|
|
167
|
+
if (hasInput && hasWitness) throw new TypeError('Input and witness provided');
|
|
166
168
|
if (hasInput) {
|
|
167
|
-
const richunks = bscript.decompile(redeem.input);
|
|
169
|
+
const richunks = bscript.decompile(redeem.input) as Stack;
|
|
168
170
|
if (!bscript.isPushOnly(richunks))
|
|
169
171
|
throw new TypeError('Non push-only scriptSig');
|
|
170
172
|
}
|
|
171
173
|
}
|
|
172
174
|
};
|
|
175
|
+
|
|
173
176
|
if (a.input) {
|
|
174
177
|
const chunks = _chunks();
|
|
175
|
-
if (!chunks || chunks.length < 1)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
throw new TypeError('Input is invalid');
|
|
178
|
+
if (!chunks || chunks.length < 1) throw new TypeError('Input too short');
|
|
179
|
+
if (!Buffer.isBuffer(_redeem().output)) throw new TypeError('Input is invalid');
|
|
180
|
+
|
|
179
181
|
checkRedeem(_redeem());
|
|
180
182
|
}
|
|
183
|
+
|
|
181
184
|
if (a.redeem) {
|
|
182
185
|
if (a.redeem.network && a.redeem.network !== network)
|
|
183
186
|
throw new TypeError('Network mismatch');
|
|
184
187
|
if (a.input) {
|
|
185
188
|
const redeem = _redeem();
|
|
186
|
-
if (a.redeem.output && !a.redeem.output.equals(redeem.output))
|
|
189
|
+
if (a.redeem.output && !a.redeem.output.equals(redeem.output!))
|
|
187
190
|
throw new TypeError('Redeem.output mismatch');
|
|
188
|
-
if (a.redeem.input && !a.redeem.input.equals(redeem.input))
|
|
191
|
+
if (a.redeem.input && !a.redeem.input.equals(redeem.input!))
|
|
189
192
|
throw new TypeError('Redeem.input mismatch');
|
|
190
193
|
}
|
|
194
|
+
|
|
191
195
|
checkRedeem(a.redeem);
|
|
192
196
|
}
|
|
197
|
+
|
|
193
198
|
if (a.witness) {
|
|
194
|
-
if (
|
|
195
|
-
a.redeem &&
|
|
196
|
-
a.redeem.witness &&
|
|
197
|
-
!(0, types_1.stacksEqual)(a.redeem.witness, a.witness)
|
|
198
|
-
)
|
|
199
|
+
if (a.redeem && a.redeem.witness && !stacksEqual(a.redeem.witness, a.witness))
|
|
199
200
|
throw new TypeError('Witness and redeem.witness mismatch');
|
|
200
201
|
}
|
|
201
202
|
}
|
|
203
|
+
|
|
202
204
|
return Object.assign(o, a);
|
|
203
205
|
}
|
|
204
|
-
exports.p2sh = p2sh;
|