@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,26 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const bech32_1 = require('bech32');
|
|
1
|
+
import { bech32 } from 'bech32';
|
|
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 { isPoint, stacksEqual, typeforce as typef } from '../types.js';
|
|
6
|
+
import { Payment, PaymentOpts, StackElement, StackFunction } from './index.js';
|
|
7
|
+
import * as lazy from './lazy.js';
|
|
8
|
+
|
|
10
9
|
const OPS = bscript.OPS;
|
|
10
|
+
|
|
11
11
|
const EMPTY_BUFFER = Buffer.alloc(0);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
chunk.length === 65 &&
|
|
16
|
-
chunk[0] === 0x04 &&
|
|
17
|
-
(0, types_1.isPoint)(chunk)
|
|
18
|
-
) {
|
|
12
|
+
|
|
13
|
+
function chunkHasUncompressedPubkey(chunk: StackElement): boolean {
|
|
14
|
+
if (Buffer.isBuffer(chunk) && chunk.length === 65 && chunk[0] === 0x04 && isPoint(chunk)) {
|
|
19
15
|
return true;
|
|
20
16
|
} else {
|
|
21
17
|
return false;
|
|
22
18
|
}
|
|
23
19
|
}
|
|
20
|
+
|
|
24
21
|
// input: <>
|
|
25
22
|
// witness: [redeemScriptSig ...] {redeemScript}
|
|
26
23
|
// output: OP_0 {sha256(redeemScript)}
|
|
@@ -32,35 +29,35 @@ function chunkHasUncompressedPubkey(chunk) {
|
|
|
32
29
|
* @returns The P2WSH payment object.
|
|
33
30
|
* @throws {TypeError} If the required data is missing or invalid.
|
|
34
31
|
*/
|
|
35
|
-
function p2wsh(a, opts) {
|
|
32
|
+
export function p2wsh(a: Payment, opts?: PaymentOpts): Payment {
|
|
36
33
|
if (!a.address && !a.hash && !a.output && !a.redeem && !a.witness)
|
|
37
34
|
throw new TypeError('Not enough data');
|
|
38
35
|
opts = Object.assign({ validate: true }, opts || {});
|
|
39
|
-
|
|
36
|
+
|
|
37
|
+
typef(
|
|
40
38
|
{
|
|
41
|
-
network:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
),
|
|
39
|
+
network: typef.maybe(typef.Object),
|
|
40
|
+
|
|
41
|
+
address: typef.maybe(typef.String),
|
|
42
|
+
hash: typef.maybe(typef.BufferN(32)),
|
|
43
|
+
output: typef.maybe(typef.BufferN(34)),
|
|
44
|
+
|
|
45
|
+
redeem: typef.maybe({
|
|
46
|
+
input: typef.maybe(typef.Buffer),
|
|
47
|
+
network: typef.maybe(typef.Object),
|
|
48
|
+
output: typef.maybe(typef.Buffer),
|
|
49
|
+
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
52
50
|
}),
|
|
53
|
-
input:
|
|
54
|
-
witness:
|
|
55
|
-
types_1.typeforce.arrayOf(types_1.typeforce.Buffer),
|
|
56
|
-
),
|
|
51
|
+
input: typef.maybe(typef.BufferN(0)),
|
|
52
|
+
witness: typef.maybe(typef.arrayOf(typef.Buffer)),
|
|
57
53
|
},
|
|
58
54
|
a,
|
|
59
55
|
);
|
|
56
|
+
|
|
60
57
|
const _address = lazy.value(() => {
|
|
61
|
-
const result =
|
|
58
|
+
const result = bech32.decode(a.address!);
|
|
62
59
|
const version = result.words.shift();
|
|
63
|
-
const data =
|
|
60
|
+
const data = bech32.fromWords(result.words);
|
|
64
61
|
return {
|
|
65
62
|
version,
|
|
66
63
|
prefix: result.prefix,
|
|
@@ -68,18 +65,21 @@ function p2wsh(a, opts) {
|
|
|
68
65
|
};
|
|
69
66
|
});
|
|
70
67
|
const _rchunks = lazy.value(() => {
|
|
71
|
-
return bscript.decompile(a.redeem
|
|
72
|
-
});
|
|
68
|
+
return bscript.decompile(a.redeem!.input!);
|
|
69
|
+
}) as StackFunction;
|
|
70
|
+
|
|
73
71
|
let network = a.network;
|
|
74
72
|
if (!network) {
|
|
75
|
-
network = (a.redeem && a.redeem.network) ||
|
|
73
|
+
network = (a.redeem && a.redeem.network) || BITCOIN_NETWORK;
|
|
76
74
|
}
|
|
77
|
-
|
|
75
|
+
|
|
76
|
+
const o: Payment = { network };
|
|
77
|
+
|
|
78
78
|
lazy.prop(o, 'address', () => {
|
|
79
79
|
if (!o.hash) return;
|
|
80
|
-
const words =
|
|
80
|
+
const words = bech32.toWords(o.hash);
|
|
81
81
|
words.unshift(0x00);
|
|
82
|
-
return
|
|
82
|
+
return bech32.encode(network!.bech32, words);
|
|
83
83
|
});
|
|
84
84
|
lazy.prop(o, 'hash', () => {
|
|
85
85
|
if (a.output) return a.output.slice(2);
|
|
@@ -112,54 +112,52 @@ function p2wsh(a, opts) {
|
|
|
112
112
|
a.redeem.output.length > 0
|
|
113
113
|
) {
|
|
114
114
|
const stack = bscript.toStack(_rchunks());
|
|
115
|
+
|
|
115
116
|
// assign, and blank the existing input
|
|
116
117
|
o.redeem = Object.assign({ witness: stack }, a.redeem);
|
|
117
118
|
o.redeem.input = EMPTY_BUFFER;
|
|
118
|
-
return [].concat(stack, a.redeem.output);
|
|
119
|
+
return ([] as Buffer[]).concat(stack, a.redeem.output);
|
|
119
120
|
}
|
|
121
|
+
|
|
120
122
|
if (!a.redeem) return;
|
|
121
123
|
if (!a.redeem.output) return;
|
|
122
124
|
if (!a.redeem.witness) return;
|
|
123
|
-
return [].concat(a.redeem.witness, a.redeem.output);
|
|
125
|
+
return ([] as Buffer[]).concat(a.redeem.witness, a.redeem.output);
|
|
124
126
|
});
|
|
125
127
|
lazy.prop(o, 'name', () => {
|
|
126
128
|
const nameParts = ['p2wsh'];
|
|
127
|
-
if (o.redeem !== undefined && o.redeem.name !== undefined)
|
|
128
|
-
nameParts.push(o.redeem.name);
|
|
129
|
+
if (o.redeem !== undefined && o.redeem.name !== undefined) nameParts.push(o.redeem.name!);
|
|
129
130
|
return nameParts.join('-');
|
|
130
131
|
});
|
|
132
|
+
|
|
131
133
|
// extended validation
|
|
132
134
|
if (opts.validate) {
|
|
133
|
-
let hash = Buffer.from([]);
|
|
135
|
+
let hash: Buffer = Buffer.from([]);
|
|
134
136
|
if (a.address) {
|
|
135
137
|
if (_address().prefix !== network.bech32)
|
|
136
138
|
throw new TypeError('Invalid prefix or Network mismatch');
|
|
137
|
-
if (_address().version !== 0x00)
|
|
138
|
-
|
|
139
|
-
if (_address().data.length !== 32)
|
|
140
|
-
throw new TypeError('Invalid address data');
|
|
139
|
+
if (_address().version !== 0x00) throw new TypeError('Invalid address version');
|
|
140
|
+
if (_address().data.length !== 32) throw new TypeError('Invalid address data');
|
|
141
141
|
hash = _address().data;
|
|
142
142
|
}
|
|
143
|
+
|
|
143
144
|
if (a.hash) {
|
|
144
|
-
if (hash.length > 0 && !hash.equals(a.hash))
|
|
145
|
-
throw new TypeError('Hash mismatch');
|
|
145
|
+
if (hash.length > 0 && !hash.equals(a.hash)) throw new TypeError('Hash mismatch');
|
|
146
146
|
else hash = a.hash;
|
|
147
147
|
}
|
|
148
|
+
|
|
148
149
|
if (a.output) {
|
|
149
|
-
if (
|
|
150
|
-
a.output.length !== 34 ||
|
|
151
|
-
a.output[0] !== OPS.OP_0 ||
|
|
152
|
-
a.output[1] !== 0x20
|
|
153
|
-
)
|
|
150
|
+
if (a.output.length !== 34 || a.output[0] !== OPS.OP_0 || a.output[1] !== 0x20)
|
|
154
151
|
throw new TypeError('Output is invalid');
|
|
155
152
|
const hash2 = a.output.slice(2);
|
|
156
|
-
if (hash.length > 0 && !hash.equals(hash2))
|
|
157
|
-
throw new TypeError('Hash mismatch');
|
|
153
|
+
if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
|
|
158
154
|
else hash = hash2;
|
|
159
155
|
}
|
|
156
|
+
|
|
160
157
|
if (a.redeem) {
|
|
161
158
|
if (a.redeem.network && a.redeem.network !== network)
|
|
162
159
|
throw new TypeError('Network mismatch');
|
|
160
|
+
|
|
163
161
|
// is there two redeem sources?
|
|
164
162
|
if (
|
|
165
163
|
a.redeem.input &&
|
|
@@ -168,59 +166,49 @@ function p2wsh(a, opts) {
|
|
|
168
166
|
a.redeem.witness.length > 0
|
|
169
167
|
)
|
|
170
168
|
throw new TypeError('Ambiguous witness source');
|
|
169
|
+
|
|
171
170
|
// is the redeem output non-empty/valid?
|
|
172
171
|
if (a.redeem.output) {
|
|
173
172
|
const decompile = bscript.decompile(a.redeem.output);
|
|
174
173
|
if (!decompile || decompile.length < 1)
|
|
175
174
|
throw new TypeError('Redeem.output is invalid');
|
|
176
175
|
if (a.redeem.output.byteLength > 3600)
|
|
177
|
-
throw new TypeError(
|
|
178
|
-
'Redeem.output unspendable if larger than 3600 bytes',
|
|
179
|
-
);
|
|
176
|
+
throw new TypeError('Redeem.output unspendable if larger than 3600 bytes');
|
|
180
177
|
if (bscript.countNonPushOnlyOPs(decompile) > 201)
|
|
181
178
|
throw new TypeError(
|
|
182
179
|
'Redeem.output unspendable with more than 201 non-push ops',
|
|
183
180
|
);
|
|
181
|
+
|
|
184
182
|
// match hash against other sources
|
|
185
183
|
const hash2 = bcrypto.sha256(a.redeem.output);
|
|
186
|
-
if (hash.length > 0 && !hash.equals(hash2))
|
|
187
|
-
throw new TypeError('Hash mismatch');
|
|
184
|
+
if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
|
|
188
185
|
else hash = hash2;
|
|
189
186
|
}
|
|
187
|
+
|
|
190
188
|
if (a.redeem.input && !bscript.isPushOnly(_rchunks()))
|
|
191
189
|
throw new TypeError('Non push-only scriptSig');
|
|
192
|
-
if (
|
|
193
|
-
a.witness &&
|
|
194
|
-
a.redeem.witness &&
|
|
195
|
-
!(0, types_1.stacksEqual)(a.witness, a.redeem.witness)
|
|
196
|
-
)
|
|
190
|
+
if (a.witness && a.redeem.witness && !stacksEqual(a.witness, a.redeem.witness))
|
|
197
191
|
throw new TypeError('Witness and redeem.witness mismatch');
|
|
198
192
|
if (
|
|
199
|
-
(a.redeem.input &&
|
|
200
|
-
_rchunks().some(chunkHasUncompressedPubkey)) ||
|
|
193
|
+
(a.redeem.input && _rchunks().some(chunkHasUncompressedPubkey)) ||
|
|
201
194
|
(a.redeem.output &&
|
|
202
|
-
(bscript.decompile(a.redeem.output) || []).some(
|
|
203
|
-
chunkHasUncompressedPubkey,
|
|
204
|
-
))
|
|
195
|
+
(bscript.decompile(a.redeem.output) || []).some(chunkHasUncompressedPubkey))
|
|
205
196
|
) {
|
|
206
|
-
throw new TypeError(
|
|
207
|
-
'redeem.input or redeem.output contains uncompressed pubkey',
|
|
208
|
-
);
|
|
197
|
+
throw new TypeError('redeem.input or redeem.output contains uncompressed pubkey');
|
|
209
198
|
}
|
|
210
199
|
}
|
|
200
|
+
|
|
211
201
|
if (a.witness && a.witness.length > 0) {
|
|
212
202
|
const wScript = a.witness[a.witness.length - 1];
|
|
213
203
|
if (a.redeem && a.redeem.output && !a.redeem.output.equals(wScript))
|
|
214
204
|
throw new TypeError('Witness and redeem.output mismatch');
|
|
215
205
|
if (
|
|
216
206
|
a.witness.some(chunkHasUncompressedPubkey) ||
|
|
217
|
-
(bscript.decompile(wScript) || []).some(
|
|
218
|
-
chunkHasUncompressedPubkey,
|
|
219
|
-
)
|
|
207
|
+
(bscript.decompile(wScript) || []).some(chunkHasUncompressedPubkey)
|
|
220
208
|
)
|
|
221
209
|
throw new TypeError('Witness contains uncompressed pubkey');
|
|
222
210
|
}
|
|
223
211
|
}
|
|
212
|
+
|
|
224
213
|
return Object.assign(o, a);
|
|
225
214
|
}
|
|
226
|
-
exports.p2wsh = p2wsh;
|