@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.
Files changed (259) hide show
  1. package/.babelrc +4 -0
  2. package/.gitattributes +2 -0
  3. package/.nyc_output/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
  4. package/.nyc_output/processinfo/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -0
  6. package/.prettierrc.json +12 -0
  7. package/CHANGELOG.md +403 -0
  8. package/CONTRIBUTING.md +83 -0
  9. package/browser/address.d.ts +16 -0
  10. package/{src → browser}/bip66.d.ts +6 -7
  11. package/{src → browser}/block.d.ts +29 -30
  12. package/{src → browser}/bufferutils.d.ts +34 -54
  13. package/browser/crypto/crypto.d.ts +1 -0
  14. package/{src → browser}/crypto.d.ts +13 -18
  15. package/browser/ecc_lib.d.ts +3 -0
  16. package/browser/hooks/AdvancedSignatureManager.d.ts +16 -0
  17. package/{src → browser}/hooks/HookedSigner.d.ts +4 -4
  18. package/browser/hooks/SignatureManager.d.ts +13 -0
  19. package/browser/index.d.ts +58 -0
  20. package/browser/index.js +2 -0
  21. package/browser/index.js.LICENSE.txt +14 -0
  22. package/browser/merkle.d.ts +1 -0
  23. package/browser/networks.d.ts +23 -0
  24. package/{src → browser}/ops.d.ts +126 -126
  25. package/browser/payments/bip341.d.ts +23 -0
  26. package/browser/payments/embed.d.ts +2 -0
  27. package/browser/payments/index.d.ts +41 -0
  28. package/{src → browser}/payments/lazy.d.ts +2 -2
  29. package/browser/payments/p2ms.d.ts +2 -0
  30. package/browser/payments/p2pk.d.ts +2 -0
  31. package/browser/payments/p2pkh.d.ts +2 -0
  32. package/browser/payments/p2sh.d.ts +2 -0
  33. package/browser/payments/p2tr.d.ts +2 -0
  34. package/browser/payments/p2wpkh.d.ts +2 -0
  35. package/browser/payments/p2wsh.d.ts +2 -0
  36. package/browser/psbt/bip371.d.ts +16 -0
  37. package/browser/psbt/psbtutils.d.ts +26 -0
  38. package/{src → browser}/psbt.d.ts +167 -238
  39. package/browser/push_data.d.ts +7 -0
  40. package/browser/script.d.ts +17 -0
  41. package/browser/script_number.d.ts +2 -0
  42. package/browser/script_signature.d.ts +7 -0
  43. package/{src → browser}/transaction.d.ts +48 -60
  44. package/{src → browser}/types.d.ts +37 -54
  45. package/build/address.d.ts +16 -0
  46. package/build/address.js +148 -0
  47. package/build/bip66.d.ts +6 -0
  48. package/build/bip66.js +99 -0
  49. package/build/block.d.ts +29 -0
  50. package/build/block.js +181 -0
  51. package/build/bufferutils.d.ts +34 -0
  52. package/build/bufferutils.js +141 -0
  53. package/build/crypto/crypto.d.ts +1 -0
  54. package/build/crypto/crypto.js +1 -0
  55. package/build/crypto.d.ts +13 -0
  56. package/build/crypto.js +87 -0
  57. package/build/ecc_lib.d.ts +3 -0
  58. package/build/ecc_lib.js +61 -0
  59. package/build/hooks/AdvancedSignatureManager.d.ts +16 -0
  60. package/build/hooks/AdvancedSignatureManager.js +52 -0
  61. package/build/hooks/HookedSigner.d.ts +4 -0
  62. package/build/hooks/HookedSigner.js +64 -0
  63. package/build/hooks/SignatureManager.d.ts +13 -0
  64. package/build/hooks/SignatureManager.js +45 -0
  65. package/build/index.d.ts +58 -0
  66. package/build/index.js +32 -0
  67. package/build/merkle.d.ts +1 -0
  68. package/build/merkle.js +19 -0
  69. package/build/networks.d.ts +23 -0
  70. package/build/networks.js +121 -0
  71. package/build/ops.d.ts +126 -0
  72. package/{src → build}/ops.js +127 -131
  73. package/build/payments/bip341.d.ts +23 -0
  74. package/build/payments/bip341.js +82 -0
  75. package/build/payments/embed.d.ts +2 -0
  76. package/build/payments/embed.js +39 -0
  77. package/build/payments/index.d.ts +41 -0
  78. package/build/payments/index.js +10 -0
  79. package/build/payments/lazy.d.ts +2 -0
  80. package/{src → build}/payments/lazy.js +28 -32
  81. package/build/payments/p2ms.d.ts +2 -0
  82. package/{src → build}/payments/p2ms.js +128 -158
  83. package/build/payments/p2pk.d.ts +2 -0
  84. package/build/payments/p2pk.js +68 -0
  85. package/build/payments/p2pkh.d.ts +2 -0
  86. package/build/payments/p2pkh.js +135 -0
  87. package/build/payments/p2sh.d.ts +2 -0
  88. package/build/payments/p2sh.js +175 -0
  89. package/build/payments/p2tr.d.ts +2 -0
  90. package/build/payments/p2tr.js +254 -0
  91. package/build/payments/p2wpkh.d.ts +2 -0
  92. package/build/payments/p2wpkh.js +130 -0
  93. package/build/payments/p2wsh.d.ts +2 -0
  94. package/build/payments/p2wsh.js +180 -0
  95. package/build/psbt/bip371.d.ts +16 -0
  96. package/build/psbt/bip371.js +246 -0
  97. package/build/psbt/psbtutils.d.ts +26 -0
  98. package/build/psbt/psbtutils.js +170 -0
  99. package/build/psbt.d.ts +167 -0
  100. package/build/psbt.js +1305 -0
  101. package/build/push_data.d.ts +7 -0
  102. package/build/push_data.js +57 -0
  103. package/build/script.d.ts +17 -0
  104. package/build/script.js +167 -0
  105. package/build/script_number.d.ts +2 -0
  106. package/build/script_number.js +49 -0
  107. package/build/script_signature.d.ts +7 -0
  108. package/build/script_signature.js +49 -0
  109. package/build/transaction.d.ts +48 -0
  110. package/build/transaction.js +445 -0
  111. package/build/types.d.ts +37 -0
  112. package/build/types.js +73 -0
  113. package/cjs/package.json +3 -0
  114. package/eslint.config.js +56 -0
  115. package/gulpfile.js +42 -0
  116. package/package.json +105 -50
  117. package/src/{address.js → address.ts} +93 -73
  118. package/src/{bip66.js → bip66.ts} +23 -19
  119. package/src/{block.js → block.ts} +114 -105
  120. package/src/{bufferutils.js → bufferutils.ts} +65 -67
  121. package/src/crypto/crypto-browser.js +75 -0
  122. package/src/crypto/crypto.ts +1 -0
  123. package/src/crypto.ts +108 -0
  124. package/src/{ecc_lib.js → ecc_lib.ts} +25 -53
  125. package/src/hooks/{AdvancedSignatureManager.js → AdvancedSignatureManager.ts} +34 -18
  126. package/src/hooks/HookedSigner.ts +108 -0
  127. package/src/hooks/{SignatureManager.js → SignatureManager.ts} +26 -14
  128. package/src/index.ts +86 -0
  129. package/src/{merkle.js → merkle.ts} +8 -7
  130. package/src/{networks.js → networks.ts} +44 -29
  131. package/src/ops.ts +282 -0
  132. package/src/payments/bip341.ts +140 -0
  133. package/src/payments/embed.ts +55 -0
  134. package/src/payments/{index.d.ts → index.ts} +20 -10
  135. package/src/payments/lazy.ts +28 -0
  136. package/src/payments/p2ms.ts +150 -0
  137. package/src/payments/{p2pk.js → p2pk.ts} +32 -29
  138. package/src/payments/{p2pkh.js → p2pkh.ts} +53 -47
  139. package/src/payments/{p2sh.js → p2sh.ts} +72 -71
  140. package/src/payments/{p2tr.js → p2tr.ts} +114 -125
  141. package/src/payments/{p2wpkh.js → p2wpkh.ts} +51 -56
  142. package/src/payments/{p2wsh.js → p2wsh.ts} +69 -81
  143. package/src/psbt/{bip371.js → bip371.ts} +191 -174
  144. package/src/psbt/psbtutils.ts +299 -0
  145. package/src/{psbt.js → psbt.ts} +1025 -679
  146. package/src/{push_data.js → push_data.ts} +35 -21
  147. package/src/{script.js → script.ts} +93 -77
  148. package/src/{script_number.js → script_number.ts} +15 -21
  149. package/src/{script_signature.js → script_signature.ts} +26 -14
  150. package/src/{transaction.js → transaction.ts} +247 -167
  151. package/src/types.ts +122 -0
  152. package/test/address.spec.js +124 -0
  153. package/test/address.spec.ts +177 -0
  154. package/test/bitcoin.core.spec.js +170 -0
  155. package/test/bitcoin.core.spec.ts +234 -0
  156. package/test/block.spec.js +141 -0
  157. package/test/block.spec.ts +194 -0
  158. package/test/bufferutils.spec.js +427 -0
  159. package/test/bufferutils.spec.ts +513 -0
  160. package/test/crypto.spec.js +41 -0
  161. package/test/crypto.spec.ts +55 -0
  162. package/test/fixtures/address.json +329 -0
  163. package/test/fixtures/block.json +148 -0
  164. package/test/fixtures/bufferutils.json +102 -0
  165. package/test/fixtures/core/README.md +26 -0
  166. package/test/fixtures/core/base58_encode_decode.json +50 -0
  167. package/test/fixtures/core/base58_keys_invalid.json +152 -0
  168. package/test/fixtures/core/base58_keys_valid.json +452 -0
  169. package/test/fixtures/core/blocks.json +27 -0
  170. package/test/fixtures/core/sig_canonical.json +7 -0
  171. package/test/fixtures/core/sig_noncanonical.json +33 -0
  172. package/test/fixtures/core/sighash.json +3505 -0
  173. package/test/fixtures/core/tx_valid.json +2023 -0
  174. package/test/fixtures/crypto.json +43 -0
  175. package/test/fixtures/ecdsa.json +217 -0
  176. package/test/fixtures/ecpair.json +141 -0
  177. package/test/fixtures/embed.json +108 -0
  178. package/test/fixtures/p2ms.json +434 -0
  179. package/test/fixtures/p2pk.json +179 -0
  180. package/test/fixtures/p2pkh.json +276 -0
  181. package/test/fixtures/p2sh.json +508 -0
  182. package/test/fixtures/p2tr.json +1198 -0
  183. package/test/fixtures/p2wpkh.json +290 -0
  184. package/test/fixtures/p2wsh.json +489 -0
  185. package/test/fixtures/psbt.json +924 -0
  186. package/test/fixtures/script.json +465 -0
  187. package/test/fixtures/script_number.json +225 -0
  188. package/test/fixtures/signature.json +140 -0
  189. package/test/fixtures/transaction.json +916 -0
  190. package/test/integration/_regtest.js +7 -0
  191. package/test/integration/_regtest.ts +6 -0
  192. package/test/integration/addresses.spec.js +116 -0
  193. package/test/integration/addresses.spec.ts +154 -0
  194. package/test/integration/bip32.spec.js +85 -0
  195. package/test/integration/bip32.spec.ts +151 -0
  196. package/test/integration/blocks.spec.js +26 -0
  197. package/test/integration/blocks.spec.ts +28 -0
  198. package/test/integration/cltv.spec.js +199 -0
  199. package/test/integration/cltv.spec.ts +283 -0
  200. package/test/integration/csv.spec.js +362 -0
  201. package/test/integration/csv.spec.ts +527 -0
  202. package/test/integration/payments.spec.js +98 -0
  203. package/test/integration/payments.spec.ts +135 -0
  204. package/test/integration/taproot.spec.js +532 -0
  205. package/test/integration/taproot.spec.ts +707 -0
  206. package/test/integration/transactions.spec.js +561 -0
  207. package/test/integration/transactions.spec.ts +769 -0
  208. package/test/payments.spec.js +97 -0
  209. package/test/payments.spec.ts +125 -0
  210. package/test/payments.utils.js +190 -0
  211. package/test/payments.utils.ts +208 -0
  212. package/test/psbt.spec.js +1044 -0
  213. package/test/psbt.spec.ts +1414 -0
  214. package/test/script.spec.js +151 -0
  215. package/test/script.spec.ts +210 -0
  216. package/test/script_number.spec.js +24 -0
  217. package/test/script_number.spec.ts +29 -0
  218. package/test/script_signature.spec.js +52 -0
  219. package/test/script_signature.spec.ts +66 -0
  220. package/test/transaction.spec.js +269 -0
  221. package/test/transaction.spec.ts +387 -0
  222. package/test/ts-node-register.js +5 -0
  223. package/test/tsconfig.json +45 -0
  224. package/test/types.spec.js +46 -0
  225. package/test/types.spec.ts +58 -0
  226. package/tsconfig.base.json +27 -0
  227. package/tsconfig.json +19 -0
  228. package/tsconfig.webpack.json +18 -0
  229. package/webpack.config.js +79 -0
  230. package/src/address.d.ts +0 -42
  231. package/src/crypto.js +0 -128
  232. package/src/ecc_lib.d.ts +0 -17
  233. package/src/hooks/AdvancedSignatureManager.d.ts +0 -44
  234. package/src/hooks/HookedSigner.js +0 -90
  235. package/src/hooks/SignatureManager.d.ts +0 -35
  236. package/src/index.d.ts +0 -42
  237. package/src/index.js +0 -87
  238. package/src/merkle.d.ts +0 -10
  239. package/src/networks.d.ts +0 -83
  240. package/src/payments/bip341.d.ts +0 -49
  241. package/src/payments/bip341.js +0 -124
  242. package/src/payments/embed.d.ts +0 -9
  243. package/src/payments/embed.js +0 -54
  244. package/src/payments/index.js +0 -69
  245. package/src/payments/p2ms.d.ts +0 -9
  246. package/src/payments/p2pk.d.ts +0 -10
  247. package/src/payments/p2pkh.d.ts +0 -10
  248. package/src/payments/p2sh.d.ts +0 -10
  249. package/src/payments/p2tr.d.ts +0 -10
  250. package/src/payments/p2wpkh.d.ts +0 -10
  251. package/src/payments/p2wsh.d.ts +0 -10
  252. package/src/psbt/bip371.d.ts +0 -42
  253. package/src/psbt/psbtutils.d.ts +0 -64
  254. package/src/psbt/psbtutils.js +0 -191
  255. package/src/push_data.d.ts +0 -29
  256. package/src/script.d.ts +0 -42
  257. package/src/script_number.d.ts +0 -19
  258. package/src/script_signature.d.ts +0 -21
  259. package/src/types.js +0 -106
@@ -1,13 +1,13 @@
1
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', { value: true });
3
- exports.p2sh = void 0;
4
- const bcrypto = require('../crypto');
5
- const networks_1 = require('../networks');
6
- const bscript = require('../script');
7
- const types_1 = require('../types');
8
- const lazy = require('./lazy');
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
- (0, types_1.typeforce)(
26
+
27
+ typef(
27
28
  {
28
- network: types_1.typeforce.maybe(types_1.typeforce.Object),
29
- address: types_1.typeforce.maybe(types_1.typeforce.String),
30
- hash: types_1.typeforce.maybe(types_1.typeforce.BufferN(20)),
31
- output: types_1.typeforce.maybe(types_1.typeforce.BufferN(23)),
32
- redeem: types_1.typeforce.maybe({
33
- network: types_1.typeforce.maybe(types_1.typeforce.Object),
34
- output: types_1.typeforce.maybe(types_1.typeforce.Buffer),
35
- input: types_1.typeforce.maybe(types_1.typeforce.Buffer),
36
- witness: types_1.typeforce.maybe(
37
- types_1.typeforce.arrayOf(types_1.typeforce.Buffer),
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: types_1.typeforce.maybe(types_1.typeforce.Buffer),
41
- witness: types_1.typeforce.maybe(
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) || networks_1.bitcoin;
49
+ network = (a.redeem && a.redeem.network) || BITCOIN_NETWORK;
50
50
  }
51
- const o = { network };
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.scriptHash, 0);
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
- throw new TypeError('Empty input');
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
- throw new TypeError('Input too short');
177
- if (!Buffer.isBuffer(_redeem().output))
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;