utxo-lib 1.1.5 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of utxo-lib might be problematic. Click here for more details.

Files changed (250) hide show
  1. package/index.js +47 -0
  2. package/package.json +6 -80
  3. package/LICENSE +0 -21
  4. package/README.md +0 -59
  5. package/dist/src/address.d.ts +0 -11
  6. package/dist/src/address.d.ts.map +0 -1
  7. package/dist/src/address.js +0 -37
  8. package/dist/src/addressFormat.d.ts +0 -53
  9. package/dist/src/addressFormat.d.ts.map +0 -1
  10. package/dist/src/addressFormat.js +0 -110
  11. package/dist/src/bitgo/Musig2.d.ts +0 -51
  12. package/dist/src/bitgo/Musig2.d.ts.map +0 -1
  13. package/dist/src/bitgo/Musig2.js +0 -175
  14. package/dist/src/bitgo/Unspent.d.ts +0 -95
  15. package/dist/src/bitgo/Unspent.d.ts.map +0 -1
  16. package/dist/src/bitgo/Unspent.js +0 -138
  17. package/dist/src/bitgo/UtxoPsbt.d.ts +0 -132
  18. package/dist/src/bitgo/UtxoPsbt.d.ts.map +0 -1
  19. package/dist/src/bitgo/UtxoPsbt.js +0 -469
  20. package/dist/src/bitgo/UtxoTransaction.d.ts +0 -22
  21. package/dist/src/bitgo/UtxoTransaction.d.ts.map +0 -1
  22. package/dist/src/bitgo/UtxoTransaction.js +0 -97
  23. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -26
  24. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +0 -1
  25. package/dist/src/bitgo/UtxoTransactionBuilder.js +0 -67
  26. package/dist/src/bitgo/bbc/DashPsbt.d.ts +0 -12
  27. package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +0 -1
  28. package/dist/src/bitgo/bbc/DashPsbt.js +0 -27
  29. package/dist/src/bitgo/bbc/DashTransaction.d.ts +0 -39
  30. package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +0 -1
  31. package/dist/src/bitgo/bbc/DashTransaction.js +0 -109
  32. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +0 -14
  33. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +0 -1
  34. package/dist/src/bitgo/bbc/DashTransactionBuilder.js +0 -28
  35. package/dist/src/bitgo/bbc/index.d.ts +0 -4
  36. package/dist/src/bitgo/bbc/index.d.ts.map +0 -1
  37. package/dist/src/bitgo/bbc/index.js +0 -16
  38. package/dist/src/bitgo/bitcoincash/address.d.ts +0 -35
  39. package/dist/src/bitgo/bitcoincash/address.d.ts.map +0 -1
  40. package/dist/src/bitgo/bitcoincash/address.js +0 -151
  41. package/dist/src/bitgo/bitcoincash/index.d.ts +0 -2
  42. package/dist/src/bitgo/bitcoincash/index.d.ts.map +0 -1
  43. package/dist/src/bitgo/bitcoincash/index.js +0 -14
  44. package/dist/src/bitgo/dash/DashPsbt.d.ts +0 -12
  45. package/dist/src/bitgo/dash/DashPsbt.d.ts.map +0 -1
  46. package/dist/src/bitgo/dash/DashPsbt.js +0 -27
  47. package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -39
  48. package/dist/src/bitgo/dash/DashTransaction.d.ts.map +0 -1
  49. package/dist/src/bitgo/dash/DashTransaction.js +0 -109
  50. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -14
  51. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +0 -1
  52. package/dist/src/bitgo/dash/DashTransactionBuilder.js +0 -28
  53. package/dist/src/bitgo/dash/index.d.ts +0 -4
  54. package/dist/src/bitgo/dash/index.d.ts.map +0 -1
  55. package/dist/src/bitgo/dash/index.js +0 -16
  56. package/dist/src/bitgo/index.d.ts +0 -17
  57. package/dist/src/bitgo/index.d.ts.map +0 -1
  58. package/dist/src/bitgo/index.js +0 -30
  59. package/dist/src/bitgo/keyutil.d.ts +0 -17
  60. package/dist/src/bitgo/keyutil.d.ts.map +0 -1
  61. package/dist/src/bitgo/keyutil.js +0 -37
  62. package/dist/src/bitgo/nonStandardHalfSigned.d.ts +0 -7
  63. package/dist/src/bitgo/nonStandardHalfSigned.d.ts.map +0 -1
  64. package/dist/src/bitgo/nonStandardHalfSigned.js +0 -56
  65. package/dist/src/bitgo/outputScripts.d.ts +0 -84
  66. package/dist/src/bitgo/outputScripts.d.ts.map +0 -1
  67. package/dist/src/bitgo/outputScripts.js +0 -297
  68. package/dist/src/bitgo/parseInput.d.ts +0 -92
  69. package/dist/src/bitgo/parseInput.d.ts.map +0 -1
  70. package/dist/src/bitgo/parseInput.js +0 -344
  71. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -24
  72. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +0 -1
  73. package/dist/src/bitgo/psbt/fromHalfSigned.js +0 -91
  74. package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -6
  75. package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +0 -1
  76. package/dist/src/bitgo/psbt/scriptTypes.js +0 -23
  77. package/dist/src/bitgo/signature.d.ts +0 -84
  78. package/dist/src/bitgo/signature.d.ts.map +0 -1
  79. package/dist/src/bitgo/signature.js +0 -222
  80. package/dist/src/bitgo/tnumber.d.ts +0 -9
  81. package/dist/src/bitgo/tnumber.d.ts.map +0 -1
  82. package/dist/src/bitgo/tnumber.js +0 -31
  83. package/dist/src/bitgo/transaction.d.ts +0 -29
  84. package/dist/src/bitgo/transaction.d.ts.map +0 -1
  85. package/dist/src/bitgo/transaction.js +0 -231
  86. package/dist/src/bitgo/types.d.ts +0 -5
  87. package/dist/src/bitgo/types.d.ts.map +0 -1
  88. package/dist/src/bitgo/types.js +0 -12
  89. package/dist/src/bitgo/wallet/Psbt.d.ts +0 -47
  90. package/dist/src/bitgo/wallet/Psbt.d.ts.map +0 -1
  91. package/dist/src/bitgo/wallet/Psbt.js +0 -232
  92. package/dist/src/bitgo/wallet/Unspent.d.ts +0 -47
  93. package/dist/src/bitgo/wallet/Unspent.d.ts.map +0 -1
  94. package/dist/src/bitgo/wallet/Unspent.js +0 -154
  95. package/dist/src/bitgo/wallet/WalletKeys.d.ts +0 -72
  96. package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +0 -1
  97. package/dist/src/bitgo/wallet/WalletKeys.js +0 -104
  98. package/dist/src/bitgo/wallet/WalletOutput.d.ts +0 -18
  99. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +0 -1
  100. package/dist/src/bitgo/wallet/WalletOutput.js +0 -69
  101. package/dist/src/bitgo/wallet/WalletScripts.d.ts +0 -7
  102. package/dist/src/bitgo/wallet/WalletScripts.d.ts.map +0 -1
  103. package/dist/src/bitgo/wallet/WalletScripts.js +0 -15
  104. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +0 -19
  105. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +0 -1
  106. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +0 -47
  107. package/dist/src/bitgo/wallet/chains.d.ts +0 -57
  108. package/dist/src/bitgo/wallet/chains.d.ts.map +0 -1
  109. package/dist/src/bitgo/wallet/chains.js +0 -106
  110. package/dist/src/bitgo/wallet/index.d.ts +0 -8
  111. package/dist/src/bitgo/wallet/index.d.ts.map +0 -1
  112. package/dist/src/bitgo/wallet/index.js +0 -20
  113. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +0 -26
  114. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +0 -1
  115. package/dist/src/bitgo/zcash/ZcashBufferutils.js +0 -157
  116. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +0 -36
  117. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +0 -1
  118. package/dist/src/bitgo/zcash/ZcashPsbt.js +0 -146
  119. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +0 -61
  120. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +0 -1
  121. package/dist/src/bitgo/zcash/ZcashTransaction.js +0 -341
  122. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -21
  123. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +0 -1
  124. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +0 -105
  125. package/dist/src/bitgo/zcash/address.d.ts +0 -8
  126. package/dist/src/bitgo/zcash/address.d.ts.map +0 -1
  127. package/dist/src/bitgo/zcash/address.js +0 -57
  128. package/dist/src/bitgo/zcash/hashZip0244.d.ts +0 -27
  129. package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +0 -1
  130. package/dist/src/bitgo/zcash/hashZip0244.js +0 -184
  131. package/dist/src/bitgo/zcash/index.d.ts +0 -4
  132. package/dist/src/bitgo/zcash/index.d.ts.map +0 -1
  133. package/dist/src/bitgo/zcash/index.js +0 -16
  134. package/dist/src/classify.d.ts +0 -19
  135. package/dist/src/classify.d.ts.map +0 -1
  136. package/dist/src/classify.js +0 -89
  137. package/dist/src/index.d.ts +0 -13
  138. package/dist/src/index.d.ts.map +0 -1
  139. package/dist/src/index.js +0 -36
  140. package/dist/src/networks.d.ts +0 -115
  141. package/dist/src/networks.d.ts.map +0 -1
  142. package/dist/src/networks.js +0 -458
  143. package/dist/src/noble_ecc.d.ts +0 -28
  144. package/dist/src/noble_ecc.d.ts.map +0 -1
  145. package/dist/src/noble_ecc.js +0 -168
  146. package/dist/src/payments/index.d.ts +0 -4
  147. package/dist/src/payments/index.d.ts.map +0 -1
  148. package/dist/src/payments/index.js +0 -8
  149. package/dist/src/payments/p2tr.d.ts +0 -3
  150. package/dist/src/payments/p2tr.d.ts.map +0 -1
  151. package/dist/src/payments/p2tr.js +0 -348
  152. package/dist/src/payments/p2tr_ns.d.ts +0 -3
  153. package/dist/src/payments/p2tr_ns.d.ts.map +0 -1
  154. package/dist/src/payments/p2tr_ns.js +0 -134
  155. package/dist/src/taproot.d.ts +0 -141
  156. package/dist/src/taproot.d.ts.map +0 -1
  157. package/dist/src/taproot.js +0 -384
  158. package/dist/src/templates/multisig/index.d.ts +0 -4
  159. package/dist/src/templates/multisig/index.d.ts.map +0 -1
  160. package/dist/src/templates/multisig/index.js +0 -8
  161. package/dist/src/templates/multisig/input.d.ts +0 -7
  162. package/dist/src/templates/multisig/input.d.ts.map +0 -1
  163. package/dist/src/templates/multisig/input.js +0 -25
  164. package/dist/src/templates/multisig/output.d.ts +0 -7
  165. package/dist/src/templates/multisig/output.d.ts.map +0 -1
  166. package/dist/src/templates/multisig/output.js +0 -38
  167. package/dist/src/templates/nulldata.d.ts +0 -10
  168. package/dist/src/templates/nulldata.d.ts.map +0 -1
  169. package/dist/src/templates/nulldata.js +0 -17
  170. package/dist/src/templates/pubkey/index.d.ts +0 -4
  171. package/dist/src/templates/pubkey/index.d.ts.map +0 -1
  172. package/dist/src/templates/pubkey/index.js +0 -8
  173. package/dist/src/templates/pubkey/input.d.ts +0 -7
  174. package/dist/src/templates/pubkey/input.d.ts.map +0 -1
  175. package/dist/src/templates/pubkey/input.js +0 -14
  176. package/dist/src/templates/pubkey/output.d.ts +0 -7
  177. package/dist/src/templates/pubkey/output.d.ts.map +0 -1
  178. package/dist/src/templates/pubkey/output.js +0 -15
  179. package/dist/src/templates/pubkeyhash/index.d.ts +0 -4
  180. package/dist/src/templates/pubkeyhash/index.d.ts.map +0 -1
  181. package/dist/src/templates/pubkeyhash/index.js +0 -8
  182. package/dist/src/templates/pubkeyhash/input.d.ts +0 -7
  183. package/dist/src/templates/pubkeyhash/input.d.ts.map +0 -1
  184. package/dist/src/templates/pubkeyhash/input.js +0 -16
  185. package/dist/src/templates/pubkeyhash/output.d.ts +0 -6
  186. package/dist/src/templates/pubkeyhash/output.d.ts.map +0 -1
  187. package/dist/src/templates/pubkeyhash/output.js +0 -20
  188. package/dist/src/templates/scripthash/index.d.ts +0 -4
  189. package/dist/src/templates/scripthash/index.d.ts.map +0 -1
  190. package/dist/src/templates/scripthash/index.js +0 -8
  191. package/dist/src/templates/scripthash/input.d.ts +0 -6
  192. package/dist/src/templates/scripthash/input.d.ts.map +0 -1
  193. package/dist/src/templates/scripthash/input.js +0 -43
  194. package/dist/src/templates/scripthash/output.d.ts +0 -6
  195. package/dist/src/templates/scripthash/output.d.ts.map +0 -1
  196. package/dist/src/templates/scripthash/output.js +0 -15
  197. package/dist/src/templates/taproot/index.d.ts +0 -4
  198. package/dist/src/templates/taproot/index.d.ts.map +0 -1
  199. package/dist/src/templates/taproot/index.js +0 -8
  200. package/dist/src/templates/taproot/input.d.ts +0 -6
  201. package/dist/src/templates/taproot/input.d.ts.map +0 -1
  202. package/dist/src/templates/taproot/input.js +0 -23
  203. package/dist/src/templates/taproot/output.d.ts +0 -6
  204. package/dist/src/templates/taproot/output.d.ts.map +0 -1
  205. package/dist/src/templates/taproot/output.js +0 -15
  206. package/dist/src/templates/taprootnofn/index.d.ts +0 -4
  207. package/dist/src/templates/taprootnofn/index.d.ts.map +0 -1
  208. package/dist/src/templates/taprootnofn/index.js +0 -8
  209. package/dist/src/templates/taprootnofn/input.d.ts +0 -7
  210. package/dist/src/templates/taprootnofn/input.d.ts.map +0 -1
  211. package/dist/src/templates/taprootnofn/input.js +0 -24
  212. package/dist/src/templates/taprootnofn/output.d.ts +0 -7
  213. package/dist/src/templates/taprootnofn/output.d.ts.map +0 -1
  214. package/dist/src/templates/taprootnofn/output.js +0 -28
  215. package/dist/src/templates/witnesscommitment/index.d.ts +0 -3
  216. package/dist/src/templates/witnesscommitment/index.d.ts.map +0 -1
  217. package/dist/src/templates/witnesscommitment/index.js +0 -6
  218. package/dist/src/templates/witnesscommitment/output.d.ts +0 -8
  219. package/dist/src/templates/witnesscommitment/output.d.ts.map +0 -1
  220. package/dist/src/templates/witnesscommitment/output.js +0 -31
  221. package/dist/src/templates/witnesspubkeyhash/index.d.ts +0 -4
  222. package/dist/src/templates/witnesspubkeyhash/index.d.ts.map +0 -1
  223. package/dist/src/templates/witnesspubkeyhash/index.js +0 -8
  224. package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -7
  225. package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +0 -1
  226. package/dist/src/templates/witnesspubkeyhash/input.js +0 -19
  227. package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -6
  228. package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +0 -1
  229. package/dist/src/templates/witnesspubkeyhash/output.js +0 -15
  230. package/dist/src/templates/witnessscripthash/index.d.ts +0 -4
  231. package/dist/src/templates/witnessscripthash/index.d.ts.map +0 -1
  232. package/dist/src/templates/witnessscripthash/index.js +0 -8
  233. package/dist/src/templates/witnessscripthash/input.d.ts +0 -6
  234. package/dist/src/templates/witnessscripthash/input.d.ts.map +0 -1
  235. package/dist/src/templates/witnessscripthash/input.js +0 -35
  236. package/dist/src/templates/witnessscripthash/output.d.ts +0 -6
  237. package/dist/src/templates/witnessscripthash/output.d.ts.map +0 -1
  238. package/dist/src/templates/witnessscripthash/output.js +0 -15
  239. package/dist/src/testutil/index.d.ts +0 -3
  240. package/dist/src/testutil/index.d.ts.map +0 -1
  241. package/dist/src/testutil/index.js +0 -15
  242. package/dist/src/testutil/keys.d.ts +0 -10
  243. package/dist/src/testutil/keys.d.ts.map +0 -1
  244. package/dist/src/testutil/keys.js +0 -40
  245. package/dist/src/testutil/mock.d.ts +0 -21
  246. package/dist/src/testutil/mock.d.ts.map +0 -1
  247. package/dist/src/testutil/mock.js +0 -86
  248. package/dist/src/transaction_builder.d.ts +0 -47
  249. package/dist/src/transaction_builder.d.ts.map +0 -1
  250. package/dist/src/transaction_builder.js +0 -1084
@@ -1,384 +0,0 @@
1
- "use strict";
2
- // Taproot-specific key aggregation and taptree logic as defined in:
3
- // https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
4
- // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getTweakedOutputKey = exports.getTaptreeRoot = exports.getTapleafHash = exports.parseControlBlock = exports.parseTaprootWitness = exports.getControlBlock = exports.getHuffmanTaptree = exports.getDepthFirstTaptree = exports.tapTweakPubkey = exports.tapTweakPrivkey = exports.hashTapBranch = exports.hashTapLeaf = exports.serializeScriptSize = exports.aggregateMuSigPubkeys = exports.INITIAL_TAPSCRIPT_VERSION = exports.EVEN_Y_COORD_PREFIX = void 0;
7
- const assert = require("assert");
8
- const FastPriorityQueue = require("fastpriorityqueue");
9
- const bitcoinjs_lib_1 = require("bitcoinjs-lib");
10
- const varuint = require('varuint-bitcoin');
11
- /**
12
- * The 0x02 prefix indicating an even Y coordinate which is implicitly assumed
13
- * on all 32 byte x-only pub keys as defined in BIP340.
14
- */
15
- exports.EVEN_Y_COORD_PREFIX = Buffer.of(0x02);
16
- exports.INITIAL_TAPSCRIPT_VERSION = 0xc0;
17
- /**
18
- * Aggregates a list of public keys into a single MuSig2* public key
19
- * according to the MuSig2 paper.
20
- * @param ecc Elliptic curve implementation
21
- * @param pubkeys The list of pub keys to aggregate
22
- * @returns a 32 byte Buffer representing the aggregate key
23
- */
24
- function aggregateMuSigPubkeys(ecc, pubkeys) {
25
- // TODO: Consider enforcing key uniqueness.
26
- assert(pubkeys.length > 1, 'at least two pubkeys are required for musig key aggregation');
27
- // Sort the keys in ascending order
28
- pubkeys.sort(Buffer.compare);
29
- // In MuSig all signers contribute key material to a single signing key,
30
- // using the equation
31
- //
32
- // P = sum_i µ_i * P_i
33
- //
34
- // where `P_i` is the public key of the `i`th signer and `µ_i` is a so-called
35
- // _MuSig coefficient_ computed according to the following equation
36
- //
37
- // L = H(P_1 || P_2 || ... || P_n)
38
- // µ_i = H(L || P_i)
39
- const L = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg list', Buffer.concat(pubkeys));
40
- const secondUniquePubkey = pubkeys.find((pubkey) => !pubkeys[0].equals(pubkey));
41
- const tweakedPubkeys = pubkeys.map((pubkey) => {
42
- const xyPubkey = Buffer.concat([exports.EVEN_Y_COORD_PREFIX, pubkey]);
43
- if (secondUniquePubkey !== undefined && secondUniquePubkey.equals(pubkey)) {
44
- // The second unique key in the pubkey list given to ''KeyAgg'' (as well
45
- // as any keys identical to this key) gets the constant KeyAgg
46
- // coefficient 1 which saves an exponentiation (see the MuSig2* appendix
47
- // in the MuSig2 paper).
48
- return xyPubkey;
49
- }
50
- const c = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg coefficient', Buffer.concat([L, pubkey]));
51
- const tweakedPubkey = ecc.pointMultiply(xyPubkey, c);
52
- if (!tweakedPubkey) {
53
- throw new Error('Failed to multiply pubkey by coefficient');
54
- }
55
- return tweakedPubkey;
56
- });
57
- const aggregatePubkey = tweakedPubkeys.reduce((prev, curr) => {
58
- const next = ecc.pointAdd(prev, curr);
59
- if (!next)
60
- throw new Error('Failed to sum pubkeys');
61
- return next;
62
- });
63
- return aggregatePubkey.slice(1);
64
- }
65
- exports.aggregateMuSigPubkeys = aggregateMuSigPubkeys;
66
- /**
67
- * Encodes the length of a script as a bitcoin variable length integer.
68
- * @param script
69
- * @returns
70
- */
71
- function serializeScriptSize(script) {
72
- return varuint.encode(script.length);
73
- }
74
- exports.serializeScriptSize = serializeScriptSize;
75
- /**
76
- * Gets a tapleaf tagged hash from a script.
77
- * @param script
78
- * @returns
79
- */
80
- function hashTapLeaf(script, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
81
- const size = serializeScriptSize(script);
82
- return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), size, script]));
83
- }
84
- exports.hashTapLeaf = hashTapLeaf;
85
- /**
86
- * Creates a lexicographically sorted tapbranch from two child taptree nodes
87
- * and returns its tagged hash.
88
- * @param child1
89
- * @param child2
90
- * @returns the tagged tapbranch hash
91
- */
92
- function hashTapBranch(child1, child2) {
93
- // sort the children lexicographically
94
- const sortedChildren = [child1, child2].sort(Buffer.compare);
95
- return bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat(sortedChildren));
96
- }
97
- exports.hashTapBranch = hashTapBranch;
98
- function calculateTapTweak(pubkey, taptreeRoot) {
99
- if (taptreeRoot) {
100
- return bitcoinjs_lib_1.crypto.taggedHash('TapTweak', Buffer.concat([pubkey, taptreeRoot]));
101
- }
102
- // If the spending conditions do not require a script path, the output key should commit to an
103
- // unspendable script path instead of having no script path.
104
- // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#cite_note-22
105
- return bitcoinjs_lib_1.crypto.taggedHash('TapTweak', Buffer.from(pubkey));
106
- }
107
- /**
108
- * Tweaks a privkey, using the tagged hash of its pubkey, and (optionally) a taptree root
109
- * @param ecc Elliptic curve implementation
110
- * @param pubkey public key, used to calculate the tweak
111
- * @param privkey the privkey to tweak
112
- * @param taptreeRoot the taptree root tagged hash
113
- * @returns {Buffer} the tweaked privkey
114
- */
115
- function tapTweakPrivkey(ecc, pubkey, privkey, taptreeRoot) {
116
- const tapTweak = calculateTapTweak(pubkey, taptreeRoot);
117
- const point = ecc.pointFromScalar(privkey);
118
- if (!point)
119
- throw new Error('Invalid private key');
120
- if (point[0] % 2 === 1)
121
- privkey = ecc.privateNegate(privkey);
122
- const result = ecc.privateAdd(privkey, tapTweak);
123
- if (!result)
124
- throw new Error('Invalid private key');
125
- return result;
126
- }
127
- exports.tapTweakPrivkey = tapTweakPrivkey;
128
- /**
129
- * Tweaks an internal pubkey, using the tagged hash of itself, and (optionally) a taptree root
130
- * @param ecc Elliptic curve implementation
131
- * @param pubkey the internal pubkey to tweak
132
- * @param taptreeRoot the taptree root tagged hash
133
- * @returns {TweakedPubkey} the tweaked pubkey
134
- */
135
- function tapTweakPubkey(ecc, pubkey, taptreeRoot) {
136
- const tapTweak = calculateTapTweak(pubkey, taptreeRoot);
137
- const result = ecc.xOnlyPointAddTweak(pubkey, tapTweak);
138
- if (!result)
139
- throw new Error('Invalid pubkey');
140
- return result;
141
- }
142
- exports.tapTweakPubkey = tapTweakPubkey;
143
- function recurseTaptree(leaves, targetDepth = 0) {
144
- const { value, done } = leaves.next();
145
- assert(!done, 'insufficient leaves to reconstruct tap tree');
146
- const [index, leaf] = value;
147
- const tree = {
148
- root: hashTapLeaf(leaf.script, leaf.leafVersion),
149
- paths: [],
150
- };
151
- tree.paths[index] = [];
152
- for (let depth = leaf.depth; depth > targetDepth; depth--) {
153
- const sibling = recurseTaptree(leaves, depth);
154
- tree.paths.forEach((path) => path.push(sibling.root));
155
- sibling.paths.forEach((path) => path.push(tree.root));
156
- tree.root = hashTapBranch(tree.root, sibling.root);
157
- // Merge disjoint sparse arrays of paths into tree.paths
158
- Object.assign(tree.paths, sibling.paths);
159
- }
160
- return tree;
161
- }
162
- /**
163
- * Gets the root hash and hash-paths of a taptree from the depth-first
164
- * construction used in BIP-0371 PSBTs
165
- * @param tree
166
- * @returns {Taptree} the tree, represented by its root hash, and the paths to
167
- * that root from each of the input scripts
168
- */
169
- function getDepthFirstTaptree(tree) {
170
- const iter = tree.leaves.entries();
171
- const ret = recurseTaptree(iter);
172
- assert(iter.next().done, 'invalid tap tree, no path to some leaves');
173
- return ret;
174
- }
175
- exports.getDepthFirstTaptree = getDepthFirstTaptree;
176
- /**
177
- * Gets the root hash of a taptree using a weighted Huffman construction from a
178
- * list of scripts and corresponding weights.
179
- * @param scripts
180
- * @param weights
181
- * @returns {Taptree} the tree, represented by its root hash, and the paths to that root from each of the input scripts
182
- */
183
- function getHuffmanTaptree(scripts, weights) {
184
- assert(scripts.length > 0, 'at least one script is required to construct a tap tree');
185
- // Create a queue/heap of the provided scripts prioritized according to their
186
- // corresponding weights.
187
- const queue = new FastPriorityQueue((a, b) => {
188
- return a.weight < b.weight;
189
- });
190
- scripts.forEach((script, index) => {
191
- const weight = weights[index] || 1;
192
- assert(weight > 0, 'script weight must be a positive value');
193
- queue.add({
194
- weight,
195
- taggedHash: hashTapLeaf(script),
196
- paths: { [index]: [] },
197
- });
198
- });
199
- // Now that we have a queue of weighted scripts, we begin a loop whereby we
200
- // remove the two lowest weighted items from the queue. We create a tap branch
201
- // node from the two items, and add the branch back to the queue with the
202
- // combined weight of both its children. Each loop reduces the number of items
203
- // in the queue by one, and we repeat until we are left with only one item -
204
- // this becomes the tap tree root.
205
- //
206
- // For example, if we begin with scripts A, B, C, D with weights 6, 3, 1, 1
207
- // After first loop: A(6), B(3), CD(1 + 1)
208
- // After second loop: A(6), B[CD](3 + 2)
209
- // Final loop: A[B[CD]](6+5)
210
- // The final tree will look like:
211
- //
212
- // A[B[CD]]
213
- // / \
214
- // A B[CD]
215
- // / \
216
- // B [CD]
217
- // / \
218
- // C D
219
- //
220
- // This ensures that the spending conditions we believe to have the highest
221
- // probability of being used are further up the tree than less likely scripts,
222
- // thereby reducing the size of the merkle proofs for the more likely scripts.
223
- while (queue.size > 1) {
224
- // We can safely expect two polls to return non-null elements since we've
225
- // checked that the queue has at least two elements before looping.
226
- const child1 = queue.poll();
227
- const child2 = queue.poll();
228
- Object.values(child1.paths).forEach((path) => path.push(child2.taggedHash));
229
- Object.values(child2.paths).forEach((path) => path.push(child1.taggedHash));
230
- queue.add({
231
- taggedHash: hashTapBranch(child1.taggedHash, child2.taggedHash),
232
- weight: child1.weight + child2.weight,
233
- paths: { ...child1.paths, ...child2.paths },
234
- });
235
- }
236
- // After the while loop above completes we should have exactly one element
237
- // remaining in the queue, which we can safely extract below.
238
- const rootNode = queue.poll();
239
- const paths = Object.entries(rootNode.paths).reduce((acc, [index, path]) => {
240
- acc[Number(index)] = path; // TODO: Why doesn't TS know it's a number?
241
- return acc;
242
- }, Array(scripts.length));
243
- return { root: rootNode.taggedHash, paths };
244
- }
245
- exports.getHuffmanTaptree = getHuffmanTaptree;
246
- function getControlBlock(parity, pubkey, path, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
247
- const parityVersion = leafVersion + parity;
248
- return Buffer.concat([Buffer.of(parityVersion), pubkey, ...path]);
249
- }
250
- exports.getControlBlock = getControlBlock;
251
- /**
252
- * Parses a taproot witness stack and extracts key data elements.
253
- * @param witnessStack
254
- * @returns {ScriptPathWitness|KeyPathWitness} an object representing the
255
- * parsed witness for a script path or key path spend.
256
- * @throws {Error} if the witness stack does not conform to the BIP 341 script validation rules
257
- */
258
- function parseTaprootWitness(witnessStack) {
259
- let annex;
260
- if (witnessStack.length >= 2 && witnessStack[witnessStack.length - 1][0] === 0x50) {
261
- // If there are at least two witness elements, and the first byte of the last element is
262
- // 0x50, this last element is called annex a and is removed from the witness stack
263
- annex = witnessStack[witnessStack.length - 1];
264
- witnessStack = witnessStack.slice(0, -1);
265
- }
266
- if (witnessStack.length < 1) {
267
- throw new Error('witness stack must have at least one element');
268
- }
269
- else if (witnessStack.length === 1) {
270
- // key path spend
271
- const signature = witnessStack[0];
272
- if (!bitcoinjs_lib_1.script.isCanonicalSchnorrSignature(signature)) {
273
- throw new Error('invalid signature');
274
- }
275
- return { spendType: 'Key', signature, annex };
276
- }
277
- // script path spend
278
- // second to last element is the tapscript
279
- const tapscript = witnessStack[witnessStack.length - 2];
280
- const tapscriptChunks = bitcoinjs_lib_1.script.decompile(tapscript);
281
- if (!tapscriptChunks || tapscriptChunks.length === 0) {
282
- throw new Error('tapscript is not a valid script');
283
- }
284
- // The last stack element is called the control block c, and must have length 33 + 32m,
285
- // for a value of m that is an integer between 0 and 128, inclusive
286
- const controlBlock = witnessStack[witnessStack.length - 1];
287
- if (controlBlock.length < 33 || controlBlock.length > 33 + 32 * 128 || controlBlock.length % 32 !== 1) {
288
- throw new Error('invalid control block length');
289
- }
290
- return {
291
- spendType: 'Script',
292
- scriptSig: witnessStack.slice(0, -2),
293
- tapscript,
294
- controlBlock,
295
- annex,
296
- };
297
- }
298
- exports.parseTaprootWitness = parseTaprootWitness;
299
- /**
300
- * Parses a taproot control block.
301
- * @param ecc Elliptic curve implementation
302
- * @param controlBlock the control block to parse
303
- * @returns {ControlBlock} the parsed control block
304
- * @throws {Error} if the witness stack does not conform to the BIP 341 script validation rules
305
- */
306
- function parseControlBlock(ecc, controlBlock) {
307
- if ((controlBlock.length - 1) % 32 !== 0) {
308
- throw new TypeError('Invalid control block length');
309
- }
310
- const parity = controlBlock[0] & 0x01;
311
- // Let p = c[1:33] and let P = lift_x(int(p)) where lift_x and [:] are defined as in BIP340.
312
- // Fail if this point is not on the curve
313
- const internalPubkey = controlBlock.slice(1, 33);
314
- if (!ecc.isXOnlyPoint(internalPubkey)) {
315
- throw new Error('internal pubkey is not an EC point');
316
- }
317
- // The leaf version cannot be 0x50 as that would result in ambiguity with the annex.
318
- const leafVersion = controlBlock[0] & 0xfe;
319
- if (leafVersion === 0x50) {
320
- throw new Error('invalid leaf version');
321
- }
322
- const path = [];
323
- for (let j = 33; j < controlBlock.length; j += 32) {
324
- path.push(controlBlock.slice(j, j + 32));
325
- }
326
- return {
327
- parity,
328
- internalPubkey,
329
- leafVersion,
330
- path,
331
- };
332
- }
333
- exports.parseControlBlock = parseControlBlock;
334
- /**
335
- * Calculates the tapleaf hash from a control block and script.
336
- * @param ecc Elliptic curve implementation
337
- * @param controlBlock the control block, either raw or parsed
338
- * @param tapscript the leaf script corresdponding to the control block
339
- * @returns {Buffer} the tapleaf hash
340
- */
341
- function getTapleafHash(ecc, controlBlock, tapscript) {
342
- if (Buffer.isBuffer(controlBlock)) {
343
- controlBlock = parseControlBlock(ecc, controlBlock);
344
- }
345
- const { leafVersion } = controlBlock;
346
- return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), serializeScriptSize(tapscript), tapscript]));
347
- }
348
- exports.getTapleafHash = getTapleafHash;
349
- /**
350
- * Calculates the taptree root hash from a control block and script.
351
- * @param ecc Elliptic curve implementation
352
- * @param controlBlock the control block, either raw or parsed
353
- * @param tapscript the leaf script corresdponding to the control block
354
- * @param tapleafHash the leaf hash if already calculated
355
- * @returns {Buffer} the taptree root hash
356
- */
357
- function getTaptreeRoot(ecc, controlBlock, tapscript, tapleafHash) {
358
- if (Buffer.isBuffer(controlBlock)) {
359
- controlBlock = parseControlBlock(ecc, controlBlock);
360
- }
361
- const { path } = controlBlock;
362
- tapleafHash = tapleafHash || getTapleafHash(ecc, controlBlock, tapscript);
363
- // `taptreeMerkleHash` begins as our tapscript tapleaf hash and its value iterates
364
- // through its parent tapbranch hashes until it ends up as the taptree root hash
365
- let taptreeMerkleHash = tapleafHash;
366
- for (const taptreeSiblingHash of path) {
367
- taptreeMerkleHash =
368
- Buffer.compare(taptreeMerkleHash, taptreeSiblingHash) === -1
369
- ? bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat([taptreeMerkleHash, taptreeSiblingHash]))
370
- : bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat([taptreeSiblingHash, taptreeMerkleHash]));
371
- }
372
- return taptreeMerkleHash;
373
- }
374
- exports.getTaptreeRoot = getTaptreeRoot;
375
- function getTweakedOutputKey(payment) {
376
- var _a;
377
- assert(payment.output);
378
- if (payment.output.length === 34) {
379
- return (_a = payment.output) === null || _a === void 0 ? void 0 : _a.subarray(2);
380
- }
381
- throw new Error(`invalid p2tr tweaked output key size ${payment.output.length}`);
382
- }
383
- exports.getTweakedOutputKey = getTweakedOutputKey;
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwcm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXByb290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvRUFBb0U7QUFDcEUsaUVBQWlFO0FBQ2pFLGlFQUFpRTs7O0FBR2pFLGlDQUFrQztBQUNsQyx1REFBd0Q7QUFDeEQsaURBQTRGO0FBQzVGLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTNDOzs7R0FHRztBQUNVLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxRQUFBLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQVk5Qzs7Ozs7O0dBTUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxHQUEyQixFQUFFLE9BQWlCO0lBQ2xGLDJDQUEyQztJQUMzQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsNkRBQTZELENBQUMsQ0FBQztJQUUxRixtQ0FBbUM7SUFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFN0Isd0VBQXdFO0lBQ3hFLHFCQUFxQjtJQUNyQixFQUFFO0lBQ0YsMEJBQTBCO0lBQzFCLEVBQUU7SUFDRiw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQ25FLEVBQUU7SUFDRixrQ0FBa0M7SUFDbEMsb0JBQW9CO0lBRXBCLE1BQU0sQ0FBQyxHQUFHLHNCQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFcEUsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVoRixNQUFNLGNBQWMsR0FBaUIsT0FB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QUFrRjtJQUNsRixnRkFBZ0Y7SUFDaEYsSUFBSSxpQkFBaUIsR0FBRyxXQUFXLENBQUM7SUFDcEMsS0FBSyxNQUFNLGtCQUFrQixJQUFJLElBQUksRUFBRTtRQUNyQyxpQkFBaUI7WUFDZixNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLENBQUMsc0JBQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLENBQUMsQ0FBQyxzQkFBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9GO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDO0FBeEJELHdDQXdCQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLE9BQTBCOztJQUM1RCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ2hDLE9BQU8sTUFBQSxPQUFPLENBQUMsTUFBTSwwQ0FBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQU5ELGtEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGFwcm9vdC1zcGVjaWZpYyBrZXkgYWdncmVnYXRpb24gYW5kIHRhcHRyZWUgbG9naWMgYXMgZGVmaW5lZCBpbjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDAubWVkaWF3aWtpXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQxLm1lZGlhd2lraVxuXG5pbXBvcnQgeyBUYXBUcmVlIGFzIFBzYnRUYXBUcmVlLCBUYXBMZWFmIGFzIFBzYnRUYXBMZWFmIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5pbXBvcnQgRmFzdFByaW9yaXR5UXVldWUgPSByZXF1aXJlKCdmYXN0cHJpb3JpdHlxdWV1ZScpO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQsIGNyeXB0byBhcyBiY3J5cHRvLCBwYXltZW50cyBhcyBicGF5bWVudHMgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmNvbnN0IHZhcnVpbnQgPSByZXF1aXJlKCd2YXJ1aW50LWJpdGNvaW4nKTtcblxuLyoqXG4gKiBUaGUgMHgwMiBwcmVmaXggaW5kaWNhdGluZyBhbiBldmVuIFkgY29vcmRpbmF0ZSB3aGljaCBpcyBpbXBsaWNpdGx5IGFzc3VtZWRcbiAqIG9uIGFsbCAzMiBieXRlIHgtb25seSBwdWIga2V5cyBhcyBkZWZpbmVkIGluIEJJUDM0MC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVWRU5fWV9DT09SRF9QUkVGSVggPSBCdWZmZXIub2YoMHgwMik7XG5leHBvcnQgY29uc3QgSU5JVElBTF9UQVBTQ1JJUFRfVkVSU0lPTiA9IDB4YzA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGlueVNlY3AyNTZrMUludGVyZmFjZSB7XG4gIGlzWE9ubHlQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbjtcbiAgeE9ubHlQb2ludEFkZFR3ZWFrKHA6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHwgbnVsbDtcbiAgcG9pbnRGcm9tU2NhbGFyKHNrOiBVaW50OEFycmF5LCBjb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwb2ludE11bHRpcGx5KGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbDtcbiAgcG9pbnRBZGQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwcml2YXRlQWRkKGQ6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogVWludDhBcnJheSB8IG51bGw7XG4gIHByaXZhdGVOZWdhdGUoZDogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBhIGxpc3Qgb2YgcHVibGljIGtleXMgaW50byBhIHNpbmdsZSBNdVNpZzIqIHB1YmxpYyBrZXlcbiAqIGFjY29yZGluZyB0byB0aGUgTXVTaWcyIHBhcGVyLlxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleXMgVGhlIGxpc3Qgb2YgcHViIGtleXMgdG8gYWdncmVnYXRlXG4gKiBAcmV0dXJucyBhIDMyIGJ5dGUgQnVmZmVyIHJlcHJlc2VudGluZyB0aGUgYWdncmVnYXRlIGtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlTXVTaWdQdWJrZXlzKGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSwgcHVia2V5czogQnVmZmVyW10pOiBVaW50OEFycmF5IHtcbiAgLy8gVE9ETzogQ29uc2lkZXIgZW5mb3JjaW5nIGtleSB1bmlxdWVuZXNzLlxuICBhc3NlcnQocHVia2V5cy5sZW5ndGggPiAxLCAnYXQgbGVhc3QgdHdvIHB1YmtleXMgYXJlIHJlcXVpcmVkIGZvciBtdXNpZyBrZXkgYWdncmVnYXRpb24nKTtcblxuICAvLyBTb3J0IHRoZSBrZXlzIGluIGFzY2VuZGluZyBvcmRlclxuICBwdWJrZXlzLnNvcnQoQnVmZmVyLmNvbXBhcmUpO1xuXG4gIC8vIEluIE11U2lnIGFsbCBzaWduZXJzIGNvbnRyaWJ1dGUga2V5IG1hdGVyaWFsIHRvIGEgc2luZ2xlIHNpZ25pbmcga2V5LFxuICAvLyB1c2luZyB0aGUgZXF1YXRpb25cbiAgLy9cbiAgLy8gICAgIFAgPSBzdW1faSDCtV9pICogUF9pXG4gIC8vXG4gIC8vIHdoZXJlIGBQX2lgIGlzIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBgaWB0aCBzaWduZXIgYW5kIGDCtV9pYCBpcyBhIHNvLWNhbGxlZFxuICAvLyBfTXVTaWcgY29lZmZpY2llbnRfIGNvbXB1dGVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGVxdWF0aW9uXG4gIC8vXG4gIC8vIEwgPSBIKFBfMSB8fCBQXzIgfHwgLi4uIHx8IFBfbilcbiAgLy8gwrVfaSA9IEgoTCB8fCBQX2kpXG5cbiAgY29uc3QgTCA9IGJjcnlwdG8udGFnZ2VkSGFzaCgnS2V5QWdnIGxpc3QnLCBCdWZmZXIuY29uY2F0KHB1YmtleXMpKTtcblxuICBjb25zdCBzZWNvbmRVbmlxdWVQdWJrZXkgPSBwdWJrZXlzLmZpbmQoKHB1YmtleSkgPT4gIXB1YmtleXNbMF0uZXF1YWxzKHB1YmtleSkpO1xuXG4gIGNvbnN0IHR3ZWFrZWRQdWJrZXlzOiBVaW50OEFycmF5W10gPSBwdWJrZXlzLm1hcCgocHVia2V5KSA9PiB7XG4gICAgY29uc3QgeHlQdWJrZXkgPSBCdWZmZXIuY29uY2F0KFtFVkVOX1lfQ09PUkRfUFJFRklYLCBwdWJrZXldKTtcblxuICAgIGlmIChzZWNvbmRVbmlxdWVQdWJrZXkgIT09IHVuZGVmaW5lZCAmJiBzZWNvbmRVbmlxdWVQdWJrZXkuZXF1YWxzKHB1YmtleSkpIHtcbiAgICAgIC8vIFRoZSBzZWNvbmQgdW5pcXVlIGtleSBpbiB0aGUgcHVia2V5IGxpc3QgZ2l2ZW4gdG8gJydLZXlBZ2cnJyAoYXMgd2VsbFxuICAgICAgLy8gYXMgYW55IGtleXMgaWRlbnRpY2FsIHRvIHRoaXMga2V5KSBnZXRzIHRoZSBjb25zdGFudCBLZXlBZ2dcbiAgICAgIC8vIGNvZWZmaWNpZW50IDEgd2hpY2ggc2F2ZXMgYW4gZXhwb25lbnRpYXRpb24gKHNlZSB0aGUgTXVTaWcyKiBhcHBlbmRpeFxuICAgICAgLy8gaW4gdGhlIE11U2lnMiBwYXBlcikuXG4gICAgICByZXR1cm4geHlQdWJrZXk7XG4gICAgfVxuXG4gICAgY29uc3QgYyA9IGJjcnlwdG8udGFnZ2VkSGFzaCgnS2V5QWdnIGNvZWZmaWNpZW50JywgQnVmZmVyLmNvbmNhdChbTCwgcHVia2V5XSkpO1xuXG4gICAgY29uc3QgdHdlYWtlZFB1YmtleSA9IGVjYy5wb2ludE11bHRpcGx5KHh5UHVia2V5LCBjKTtcbiAgICBpZiAoIXR3ZWFrZWRQdWJrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIG11bHRpcGx5IHB1YmtleSBieSBjb2VmZmljaWVudCcpO1xuICAgIH1cbiAgICByZXR1cm4gdHdlYWtlZFB1YmtleTtcbiAgfSk7XG4gIGNvbnN0IGFnZ3JlZ2F0ZVB1YmtleSA9IHR3ZWFrZWRQdWJrZXlzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBlY2MucG9pbnRBZGQocHJldiwgY3Vycik7XG4gICAgaWYgKCFuZXh0KSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdW0gcHVia2V5cycpO1xuICAgIHJldHVybiBuZXh0O1xuICB9KTtcblxuICByZXR1cm4gYWdncmVnYXRlUHVia2V5LnNsaWNlKDEpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIGxlbmd0aCBvZiBhIHNjcmlwdCBhcyBhIGJpdGNvaW4gdmFyaWFibGUgbGVuZ3RoIGludGVnZXIuXG4gKiBAcGFyYW0gc2NyaXB0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplU2NyaXB0U2l6ZShzY3JpcHQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIHJldHVybiB2YXJ1aW50LmVuY29kZShzY3JpcHQubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgdGFwbGVhZiB0YWdnZWQgaGFzaCBmcm9tIGEgc2NyaXB0LlxuICogQHBhcmFtIHNjcmlwdFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hUYXBMZWFmKHNjcmlwdDogQnVmZmVyLCBsZWFmVmVyc2lvbiA9IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT04pOiBCdWZmZXIge1xuICBjb25zdCBzaXplID0gc2VyaWFsaXplU2NyaXB0U2l6ZShzY3JpcHQpO1xuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBMZWFmJywgQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKGxlYWZWZXJzaW9uKSwgc2l6ZSwgc2NyaXB0XSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgdGFwYnJhbmNoIGZyb20gdHdvIGNoaWxkIHRhcHRyZWUgbm9kZXNcbiAqIGFuZCByZXR1cm5zIGl0cyB0YWdnZWQgaGFzaC5cbiAqIEBwYXJhbSBjaGlsZDFcbiAqIEBwYXJhbSBjaGlsZDJcbiAqIEByZXR1cm5zIHRoZSB0YWdnZWQgdGFwYnJhbmNoIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hUYXBCcmFuY2goY2hpbGQxOiBCdWZmZXIsIGNoaWxkMjogQnVmZmVyKTogQnVmZmVyIHtcbiAgLy8gc29ydCB0aGUgY2hpbGRyZW4gbGV4aWNvZ3JhcGhpY2FsbHlcbiAgY29uc3Qgc29ydGVkQ2hpbGRyZW4gPSBbY2hpbGQxLCBjaGlsZDJdLnNvcnQoQnVmZmVyLmNvbXBhcmUpO1xuXG4gIHJldHVybiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoc29ydGVkQ2hpbGRyZW4pKTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlVGFwVHdlYWsocHVia2V5OiBVaW50OEFycmF5LCB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgaWYgKHRhcHRyZWVSb290KSB7XG4gICAgcmV0dXJuIGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwVHdlYWsnLCBCdWZmZXIuY29uY2F0KFtwdWJrZXksIHRhcHRyZWVSb290XSkpO1xuICB9XG4gIC8vIElmIHRoZSBzcGVuZGluZyBjb25kaXRpb25zIGRvIG5vdCByZXF1aXJlIGEgc2NyaXB0IHBhdGgsIHRoZSBvdXRwdXQga2V5IHNob3VsZCBjb21taXQgdG8gYW5cbiAgLy8gdW5zcGVuZGFibGUgc2NyaXB0IHBhdGggaW5zdGVhZCBvZiBoYXZpbmcgbm8gc2NyaXB0IHBhdGguXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDEubWVkaWF3aWtpI2NpdGVfbm90ZS0yMlxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBUd2VhaycsIEJ1ZmZlci5mcm9tKHB1YmtleSkpO1xufVxuXG4vKipcbiAqIFR3ZWFrcyBhIHByaXZrZXksIHVzaW5nIHRoZSB0YWdnZWQgaGFzaCBvZiBpdHMgcHVia2V5LCBhbmQgKG9wdGlvbmFsbHkpIGEgdGFwdHJlZSByb290XG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gcHVia2V5IHB1YmxpYyBrZXksIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0d2Vha1xuICogQHBhcmFtIHByaXZrZXkgdGhlIHByaXZrZXkgdG8gdHdlYWtcbiAqIEBwYXJhbSB0YXB0cmVlUm9vdCB0aGUgdGFwdHJlZSByb290IHRhZ2dlZCBoYXNoXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdHdlYWtlZCBwcml2a2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXBUd2Vha1ByaXZrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICBwcml2a2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXlcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCB0YXBUd2VhayA9IGNhbGN1bGF0ZVRhcFR3ZWFrKHB1YmtleSwgdGFwdHJlZVJvb3QpO1xuXG4gIGNvbnN0IHBvaW50ID0gZWNjLnBvaW50RnJvbVNjYWxhcihwcml2a2V5KTtcbiAgaWYgKCFwb2ludCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIGlmIChwb2ludFswXSAlIDIgPT09IDEpIHByaXZrZXkgPSBlY2MucHJpdmF0ZU5lZ2F0ZShwcml2a2V5KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnByaXZhdGVBZGQocHJpdmtleSwgdGFwVHdlYWspO1xuICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgcGFyaXR5OiAxIHwgMDtcbiAgeE9ubHlQdWJrZXk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogVHdlYWtzIGFuIGludGVybmFsIHB1YmtleSwgdXNpbmcgdGhlIHRhZ2dlZCBoYXNoIG9mIGl0c2VsZiwgYW5kIChvcHRpb25hbGx5KSBhIHRhcHRyZWUgcm9vdFxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleSB0aGUgaW50ZXJuYWwgcHVia2V5IHRvIHR3ZWFrXG4gKiBAcGFyYW0gdGFwdHJlZVJvb3QgdGhlIHRhcHRyZWUgcm9vdCB0YWdnZWQgaGFzaFxuICogQHJldHVybnMge1R3ZWFrZWRQdWJrZXl9IHRoZSB0d2Vha2VkIHB1YmtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFwVHdlYWtQdWJrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IEJ1ZmZlclxuKTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgY29uc3QgdGFwVHdlYWsgPSBjYWxjdWxhdGVUYXBUd2VhayhwdWJrZXksIHRhcHRyZWVSb290KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnhPbmx5UG9pbnRBZGRUd2VhayhwdWJrZXksIHRhcFR3ZWFrKTtcbiAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJrZXknKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXB0cmVlIHtcbiAgcm9vdDogQnVmZmVyO1xuICBwYXRoczogQnVmZmVyW11bXTtcbn1cblxuaW50ZXJmYWNlIFdlaWdodGVkVGFwU2NyaXB0IHtcbiAgLyoqIEEgVGFwTGVhZiBvciBUYXBCcmFuY2ggdGFnZ2VkIGhhc2ggKi9cbiAgdGFnZ2VkSGFzaDogQnVmZmVyO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgcGF0aHM6IHtcbiAgICBbaW5kZXg6IG51bWJlcl06IEJ1ZmZlcltdO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZWN1cnNlVGFwdHJlZShsZWF2ZXM6IEl0ZXJhdG9yPFtudW1iZXIsIFBzYnRUYXBMZWFmXT4sIHRhcmdldERlcHRoID0gMCk6IFRhcHRyZWUge1xuICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBsZWF2ZXMubmV4dCgpO1xuICBhc3NlcnQoIWRvbmUsICdpbnN1ZmZpY2llbnQgbGVhdmVzIHRvIHJlY29uc3RydWN0IHRhcCB0cmVlJyk7XG4gIGNvbnN0IFtpbmRleCwgbGVhZl0gPSB2YWx1ZTtcbiAgY29uc3QgdHJlZTogVGFwdHJlZSA9IHtcbiAgICByb290OiBoYXNoVGFwTGVhZihsZWFmLnNjcmlwdCwgbGVhZi5sZWFmVmVyc2lvbiksXG4gICAgcGF0aHM6IFtdLFxuICB9O1xuICB0cmVlLnBhdGhzW2luZGV4XSA9IFtdO1xuICBmb3IgKGxldCBkZXB0aCA9IGxlYWYuZGVwdGg7IGRlcHRoID4gdGFyZ2V0RGVwdGg7IGRlcHRoLS0pIHtcbiAgICBjb25zdCBzaWJsaW5nID0gcmVjdXJzZVRhcHRyZWUobGVhdmVzLCBkZXB0aCk7XG4gICAgdHJlZS5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2goc2libGluZy5yb290KSk7XG4gICAgc2libGluZy5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2godHJlZS5yb290KSk7XG4gICAgdHJlZS5yb290ID0gaGFzaFRhcEJyYW5jaCh0cmVlLnJvb3QsIHNpYmxpbmcucm9vdCk7XG4gICAgLy8gTWVyZ2UgZGlzam9pbnQgc3BhcnNlIGFycmF5cyBvZiBwYXRocyBpbnRvIHRyZWUucGF0aHNcbiAgICBPYmplY3QuYXNzaWduKHRyZWUucGF0aHMsIHNpYmxpbmcucGF0aHMpO1xuICB9XG4gIHJldHVybiB0cmVlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHJvb3QgaGFzaCBhbmQgaGFzaC1wYXRocyBvZiBhIHRhcHRyZWUgZnJvbSB0aGUgZGVwdGgtZmlyc3RcbiAqIGNvbnN0cnVjdGlvbiB1c2VkIGluIEJJUC0wMzcxIFBTQlRzXG4gKiBAcGFyYW0gdHJlZVxuICogQHJldHVybnMge1RhcHRyZWV9IHRoZSB0cmVlLCByZXByZXNlbnRlZCBieSBpdHMgcm9vdCBoYXNoLCBhbmQgdGhlIHBhdGhzIHRvXG4gKiB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXB0aEZpcnN0VGFwdHJlZSh0cmVlOiBQc2J0VGFwVHJlZSk6IFRhcHRyZWUge1xuICBjb25zdCBpdGVyID0gdHJlZS5sZWF2ZXMuZW50cmllcygpO1xuICBjb25zdCByZXQgPSByZWN1cnNlVGFwdHJlZShpdGVyKTtcbiAgYXNzZXJ0KGl0ZXIubmV4dCgpLmRvbmUsICdpbnZhbGlkIHRhcCB0cmVlLCBubyBwYXRoIHRvIHNvbWUgbGVhdmVzJyk7XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBoYXNoIG9mIGEgdGFwdHJlZSB1c2luZyBhIHdlaWdodGVkIEh1ZmZtYW4gY29uc3RydWN0aW9uIGZyb20gYVxuICogbGlzdCBvZiBzY3JpcHRzIGFuZCBjb3JyZXNwb25kaW5nIHdlaWdodHMuXG4gKiBAcGFyYW0gc2NyaXB0c1xuICogQHBhcmFtIHdlaWdodHNcbiAqIEByZXR1cm5zIHtUYXB0cmVlfSB0aGUgdHJlZSwgcmVwcmVzZW50ZWQgYnkgaXRzIHJvb3QgaGFzaCwgYW5kIHRoZSBwYXRocyB0byB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdWZmbWFuVGFwdHJlZShzY3JpcHRzOiBCdWZmZXJbXSwgd2VpZ2h0czogQXJyYXk8bnVtYmVyIHwgdW5kZWZpbmVkPik6IFRhcHRyZWUge1xuICBhc3NlcnQoc2NyaXB0cy5sZW5ndGggPiAwLCAnYXQgbGVhc3Qgb25lIHNjcmlwdCBpcyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgYSB0YXAgdHJlZScpO1xuXG4gIC8vIENyZWF0ZSBhIHF1ZXVlL2hlYXAgb2YgdGhlIHByb3ZpZGVkIHNjcmlwdHMgcHJpb3JpdGl6ZWQgYWNjb3JkaW5nIHRvIHRoZWlyXG4gIC8vIGNvcnJlc3BvbmRpbmcgd2VpZ2h0cy5cbiAgY29uc3QgcXVldWUgPSBuZXcgRmFzdFByaW9yaXR5UXVldWU8V2VpZ2h0ZWRUYXBTY3JpcHQ+KChhLCBiKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIGEud2VpZ2h0IDwgYi53ZWlnaHQ7XG4gIH0pO1xuICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB3ZWlnaHQgPSB3ZWlnaHRzW2luZGV4XSB8fCAxO1xuICAgIGFzc2VydCh3ZWlnaHQgPiAwLCAnc2NyaXB0IHdlaWdodCBtdXN0IGJlIGEgcG9zaXRpdmUgdmFsdWUnKTtcblxuICAgIHF1ZXVlLmFkZCh7XG4gICAgICB3ZWlnaHQsXG4gICAgICB0YWdnZWRIYXNoOiBoYXNoVGFwTGVhZihzY3JpcHQpLFxuICAgICAgcGF0aHM6IHsgW2luZGV4XTogW10gfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIHF1ZXVlIG9mIHdlaWdodGVkIHNjcmlwdHMsIHdlIGJlZ2luIGEgbG9vcCB3aGVyZWJ5IHdlXG4gIC8vIHJlbW92ZSB0aGUgdHdvIGxvd2VzdCB3ZWlnaHRlZCBpdGVtcyBmcm9tIHRoZSBxdWV1ZS4gV2UgY3JlYXRlIGEgdGFwIGJyYW5jaFxuICAvLyBub2RlIGZyb20gdGhlIHR3byBpdGVtcywgYW5kIGFkZCB0aGUgYnJhbmNoIGJhY2sgdG8gdGhlIHF1ZXVlIHdpdGggdGhlXG4gIC8vIGNvbWJpbmVkIHdlaWdodCBvZiBib3RoIGl0cyBjaGlsZHJlbi4gRWFjaCBsb29wIHJlZHVjZXMgdGhlIG51bWJlciBvZiBpdGVtc1xuICAvLyBpbiB0aGUgcXVldWUgYnkgb25lLCBhbmQgd2UgcmVwZWF0IHVudGlsIHdlIGFyZSBsZWZ0IHdpdGggb25seSBvbmUgaXRlbSAtXG4gIC8vIHRoaXMgYmVjb21lcyB0aGUgdGFwIHRyZWUgcm9vdC5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUsIGlmIHdlIGJlZ2luIHdpdGggc2NyaXB0cyBBLCBCLCBDLCBEIHdpdGggd2VpZ2h0cyA2LCAzLCAxLCAxXG4gIC8vIEFmdGVyIGZpcnN0IGxvb3A6IEEoNiksIEIoMyksIENEKDEgKyAxKVxuICAvLyBBZnRlciBzZWNvbmQgbG9vcDogQSg2KSwgQltDRF0oMyArIDIpXG4gIC8vIEZpbmFsIGxvb3A6IEFbQltDRF1dKDYrNSlcbiAgLy8gVGhlIGZpbmFsIHRyZWUgd2lsbCBsb29rIGxpa2U6XG4gIC8vXG4gIC8vICAgICAgICBBW0JbQ0RdXVxuICAvLyAgICAgICAvICAgICAgICBcXFxuICAvLyAgICAgIEEgICAgICAgICBCW0NEXVxuICAvLyAgICAgICAgICAgICAgIC8gICAgIFxcXG4gIC8vICAgICAgICAgICAgICBCICAgICAgW0NEXVxuICAvLyAgICAgICAgICAgICAgICAgICAgLyAgICBcXFxuICAvLyAgICAgICAgICAgICAgICAgICBDICAgICAgRFxuICAvL1xuICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgc3BlbmRpbmcgY29uZGl0aW9ucyB3ZSBiZWxpZXZlIHRvIGhhdmUgdGhlIGhpZ2hlc3RcbiAgLy8gcHJvYmFiaWxpdHkgb2YgYmVpbmcgdXNlZCBhcmUgZnVydGhlciB1cCB0aGUgdHJlZSB0aGFuIGxlc3MgbGlrZWx5IHNjcmlwdHMsXG4gIC8vIHRoZXJlYnkgcmVkdWNpbmcgdGhlIHNpemUgb2YgdGhlIG1lcmtsZSBwcm9vZnMgZm9yIHRoZSBtb3JlIGxpa2VseSBzY3JpcHRzLlxuICB3aGlsZSAocXVldWUuc2l6ZSA+IDEpIHtcbiAgICAvLyBXZSBjYW4gc2FmZWx5IGV4cGVjdCB0d28gcG9sbHMgdG8gcmV0dXJuIG5vbi1udWxsIGVsZW1lbnRzIHNpbmNlIHdlJ3ZlXG4gICAgLy8gY2hlY2tlZCB0aGF0IHRoZSBxdWV1ZSBoYXMgYXQgbGVhc3QgdHdvIGVsZW1lbnRzIGJlZm9yZSBsb29waW5nLlxuICAgIGNvbnN0IGNoaWxkMSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcbiAgICBjb25zdCBjaGlsZDIgPSBxdWV1ZS5wb2xsKCkgYXMgV2VpZ2h0ZWRUYXBTY3JpcHQ7XG5cbiAgICBPYmplY3QudmFsdWVzKGNoaWxkMS5wYXRocykuZm9yRWFjaCgocGF0aCkgPT4gcGF0aC5wdXNoKGNoaWxkMi50YWdnZWRIYXNoKSk7XG4gICAgT2JqZWN0LnZhbHVlcyhjaGlsZDIucGF0aHMpLmZvckVhY2goKHBhdGgpID0+IHBhdGgucHVzaChjaGlsZDEudGFnZ2VkSGFzaCkpO1xuXG4gICAgcXVldWUuYWRkKHtcbiAgICAgIHRhZ2dlZEhhc2g6IGhhc2hUYXBCcmFuY2goY2hpbGQxLnRhZ2dlZEhhc2gsIGNoaWxkMi50YWdnZWRIYXNoKSxcbiAgICAgIHdlaWdodDogY2hpbGQxLndlaWdodCArIGNoaWxkMi53ZWlnaHQsXG4gICAgICBwYXRoczogeyAuLi5jaGlsZDEucGF0aHMsIC4uLmNoaWxkMi5wYXRocyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQWZ0ZXIgdGhlIHdoaWxlIGxvb3AgYWJvdmUgY29tcGxldGVzIHdlIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGVsZW1lbnRcbiAgLy8gcmVtYWluaW5nIGluIHRoZSBxdWV1ZSwgd2hpY2ggd2UgY2FuIHNhZmVseSBleHRyYWN0IGJlbG93LlxuICBjb25zdCByb290Tm9kZSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcblxuICBjb25zdCBwYXRocyA9IE9iamVjdC5lbnRyaWVzKHJvb3ROb2RlLnBhdGhzKS5yZWR1Y2UoKGFjYywgW2luZGV4LCBwYXRoXSkgPT4ge1xuICAgIGFjY1tOdW1iZXIoaW5kZXgpXSA9IHBhdGg7IC8vIFRPRE86IFdoeSBkb2Vzbid0IFRTIGtub3cgaXQncyBhIG51bWJlcj9cbiAgICByZXR1cm4gYWNjO1xuICB9LCBBcnJheShzY3JpcHRzLmxlbmd0aCkpO1xuICByZXR1cm4geyByb290OiByb290Tm9kZS50YWdnZWRIYXNoLCBwYXRocyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJvbEJsb2NrKFxuICBwYXJpdHk6IDAgfCAxLFxuICBwdWJrZXk6IFVpbnQ4QXJyYXksXG4gIHBhdGg6IEJ1ZmZlcltdLFxuICBsZWFmVmVyc2lvbiA9IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT05cbik6IEJ1ZmZlciB7XG4gIGNvbnN0IHBhcml0eVZlcnNpb24gPSBsZWFmVmVyc2lvbiArIHBhcml0eTtcblxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKHBhcml0eVZlcnNpb24pLCBwdWJrZXksIC4uLnBhdGhdKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXlQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ0tleSc7XG4gIHNpZ25hdHVyZTogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JpcHRQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ1NjcmlwdCc7XG4gIHNjcmlwdFNpZzogQnVmZmVyW107XG4gIHRhcHNjcmlwdDogQnVmZmVyO1xuICBjb250cm9sQmxvY2s6IEJ1ZmZlcjtcbiAgYW5uZXg/OiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbEJsb2NrIHtcbiAgcGFyaXR5OiBudW1iZXI7XG4gIGludGVybmFsUHVia2V5OiBCdWZmZXI7XG4gIGxlYWZWZXJzaW9uOiBudW1iZXI7XG4gIHBhdGg6IEJ1ZmZlcltdO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHRhcHJvb3Qgd2l0bmVzcyBzdGFjayBhbmQgZXh0cmFjdHMga2V5IGRhdGEgZWxlbWVudHMuXG4gKiBAcGFyYW0gd2l0bmVzc1N0YWNrXG4gKiBAcmV0dXJucyB7U2NyaXB0UGF0aFdpdG5lc3N8S2V5UGF0aFdpdG5lc3N9IGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlXG4gKiBwYXJzZWQgd2l0bmVzcyBmb3IgYSBzY3JpcHQgcGF0aCBvciBrZXkgcGF0aCBzcGVuZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhcHJvb3RXaXRuZXNzKHdpdG5lc3NTdGFjazogQnVmZmVyW10pOiBTY3JpcHRQYXRoV2l0bmVzcyB8IEtleVBhdGhXaXRuZXNzIHtcbiAgbGV0IGFubmV4O1xuICBpZiAod2l0bmVzc1N0YWNrLmxlbmd0aCA+PSAyICYmIHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMV1bMF0gPT09IDB4NTApIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHdpdG5lc3MgZWxlbWVudHMsIGFuZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbGFzdCBlbGVtZW50IGlzXG4gICAgLy8gMHg1MCwgdGhpcyBsYXN0IGVsZW1lbnQgaXMgY2FsbGVkIGFubmV4IGEgYW5kIGlzIHJlbW92ZWQgZnJvbSB0aGUgd2l0bmVzcyBzdGFja1xuICAgIGFubmV4ID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgICB3aXRuZXNzU3RhY2sgPSB3aXRuZXNzU3RhY2suc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3aXRuZXNzIHN0YWNrIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCcpO1xuICB9IGVsc2UgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBrZXkgcGF0aCBzcGVuZFxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHdpdG5lc3NTdGFja1swXTtcbiAgICBpZiAoIWJzY3JpcHQuaXNDYW5vbmljYWxTY2hub3JyU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3BlbmRUeXBlOiAnS2V5Jywgc2lnbmF0dXJlLCBhbm5leCB9O1xuICB9XG5cbiAgLy8gc2NyaXB0IHBhdGggc3BlbmRcbiAgLy8gc2Vjb25kIHRvIGxhc3QgZWxlbWVudCBpcyB0aGUgdGFwc2NyaXB0XG4gIGNvbnN0IHRhcHNjcmlwdCA9IHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMl07XG4gIGNvbnN0IHRhcHNjcmlwdENodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHRhcHNjcmlwdCk7XG5cbiAgaWYgKCF0YXBzY3JpcHRDaHVua3MgfHwgdGFwc2NyaXB0Q2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFwc2NyaXB0IGlzIG5vdCBhIHZhbGlkIHNjcmlwdCcpO1xuICB9XG5cbiAgLy8gVGhlIGxhc3Qgc3RhY2sgZWxlbWVudCBpcyBjYWxsZWQgdGhlIGNvbnRyb2wgYmxvY2sgYywgYW5kIG11c3QgaGF2ZSBsZW5ndGggMzMgKyAzMm0sXG4gIC8vIGZvciBhIHZhbHVlIG9mIG0gdGhhdCBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTI4LCBpbmNsdXNpdmVcbiAgY29uc3QgY29udHJvbEJsb2NrID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgaWYgKGNvbnRyb2xCbG9jay5sZW5ndGggPCAzMyB8fCBjb250cm9sQmxvY2subGVuZ3RoID4gMzMgKyAzMiAqIDEyOCB8fCBjb250cm9sQmxvY2subGVuZ3RoICUgMzIgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3BlbmRUeXBlOiAnU2NyaXB0JyxcbiAgICBzY3JpcHRTaWc6IHdpdG5lc3NTdGFjay5zbGljZSgwLCAtMiksXG4gICAgdGFwc2NyaXB0LFxuICAgIGNvbnRyb2xCbG9jayxcbiAgICBhbm5leCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSB0YXByb290IGNvbnRyb2wgYmxvY2suXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrIHRvIHBhcnNlXG4gKiBAcmV0dXJucyB7Q29udHJvbEJsb2NrfSB0aGUgcGFyc2VkIGNvbnRyb2wgYmxvY2tcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbnRyb2xCbG9jayhlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsIGNvbnRyb2xCbG9jazogQnVmZmVyKTogQ29udHJvbEJsb2NrIHtcbiAgaWYgKChjb250cm9sQmxvY2subGVuZ3RoIC0gMSkgJSAzMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIGNvbnN0IHBhcml0eSA9IGNvbnRyb2xCbG9ja1swXSAmIDB4MDE7XG5cbiAgLy8gTGV0IHAgPSBjWzE6MzNdIGFuZCBsZXQgUCA9IGxpZnRfeChpbnQocCkpIHdoZXJlIGxpZnRfeCBhbmQgWzpdIGFyZSBkZWZpbmVkIGFzIGluIEJJUDM0MC5cbiAgLy8gRmFpbCBpZiB0aGlzIHBvaW50IGlzIG5vdCBvbiB0aGUgY3VydmVcbiAgY29uc3QgaW50ZXJuYWxQdWJrZXkgPSBjb250cm9sQmxvY2suc2xpY2UoMSwgMzMpO1xuICBpZiAoIWVjYy5pc1hPbmx5UG9pbnQoaW50ZXJuYWxQdWJrZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBwdWJrZXkgaXMgbm90IGFuIEVDIHBvaW50Jyk7XG4gIH1cblxuICAvLyBUaGUgbGVhZiB2ZXJzaW9uIGNhbm5vdCBiZSAweDUwIGFzIHRoYXQgd291bGQgcmVzdWx0IGluIGFtYmlndWl0eSB3aXRoIHRoZSBhbm5leC5cbiAgY29uc3QgbGVhZlZlcnNpb24gPSBjb250cm9sQmxvY2tbMF0gJiAweGZlO1xuICBpZiAobGVhZlZlcnNpb24gPT09IDB4NTApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGVhZiB2ZXJzaW9uJyk7XG4gIH1cblxuICBjb25zdCBwYXRoOiBCdWZmZXJbXSA9IFtdO1xuICBmb3IgKGxldCBqID0gMzM7IGogPCBjb250cm9sQmxvY2subGVuZ3RoOyBqICs9IDMyKSB7XG4gICAgcGF0aC5wdXNoKGNvbnRyb2xCbG9jay5zbGljZShqLCBqICsgMzIpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyaXR5LFxuICAgIGludGVybmFsUHVia2V5LFxuICAgIGxlYWZWZXJzaW9uLFxuICAgIHBhdGgsXG4gIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwbGVhZiBoYXNoIGZyb20gYSBjb250cm9sIGJsb2NrIGFuZCBzY3JpcHQuXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrLCBlaXRoZXIgcmF3IG9yIHBhcnNlZFxuICogQHBhcmFtIHRhcHNjcmlwdCB0aGUgbGVhZiBzY3JpcHQgY29ycmVzZHBvbmRpbmcgdG8gdGhlIGNvbnRyb2wgYmxvY2tcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSB0YXBsZWFmIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcGxlYWZIYXNoKFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlclxuKTogQnVmZmVyIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250cm9sQmxvY2spKSB7XG4gICAgY29udHJvbEJsb2NrID0gcGFyc2VDb250cm9sQmxvY2soZWNjLCBjb250cm9sQmxvY2spO1xuICB9XG4gIGNvbnN0IHsgbGVhZlZlcnNpb24gfSA9IGNvbnRyb2xCbG9jaztcblxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKFxuICAgICdUYXBMZWFmJyxcbiAgICBCdWZmZXIuY29uY2F0KFtCdWZmZXIub2YobGVhZlZlcnNpb24pLCBzZXJpYWxpemVTY3JpcHRTaXplKHRhcHNjcmlwdCksIHRhcHNjcmlwdF0pXG4gICk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwdHJlZSByb290IGhhc2ggZnJvbSBhIGNvbnRyb2wgYmxvY2sgYW5kIHNjcmlwdC5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBjb250cm9sQmxvY2sgdGhlIGNvbnRyb2wgYmxvY2ssIGVpdGhlciByYXcgb3IgcGFyc2VkXG4gKiBAcGFyYW0gdGFwc2NyaXB0IHRoZSBsZWFmIHNjcmlwdCBjb3JyZXNkcG9uZGluZyB0byB0aGUgY29udHJvbCBibG9ja1xuICogQHBhcmFtIHRhcGxlYWZIYXNoIHRoZSBsZWFmIGhhc2ggaWYgYWxyZWFkeSBjYWxjdWxhdGVkXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcHRyZWVSb290KFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlcixcbiAgdGFwbGVhZkhhc2g/OiBCdWZmZXJcbik6IEJ1ZmZlciB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udHJvbEJsb2NrKSkge1xuICAgIGNvbnRyb2xCbG9jayA9IHBhcnNlQ29udHJvbEJsb2NrKGVjYywgY29udHJvbEJsb2NrKTtcbiAgfVxuICBjb25zdCB7IHBhdGggfSA9IGNvbnRyb2xCbG9jaztcblxuICB0YXBsZWFmSGFzaCA9IHRhcGxlYWZIYXNoIHx8IGdldFRhcGxlYWZIYXNoKGVjYywgY29udHJvbEJsb2NrLCB0YXBzY3JpcHQpO1xuXG4gIC8vIGB0YXB0cmVlTWVya2xlSGFzaGAgYmVnaW5zIGFzIG91ciB0YXBzY3JpcHQgdGFwbGVhZiBoYXNoIGFuZCBpdHMgdmFsdWUgaXRlcmF0ZXNcbiAgLy8gdGhyb3VnaCBpdHMgcGFyZW50IHRhcGJyYW5jaCBoYXNoZXMgdW50aWwgaXQgZW5kcyB1cCBhcyB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAgbGV0IHRhcHRyZWVNZXJrbGVIYXNoID0gdGFwbGVhZkhhc2g7XG4gIGZvciAoY29uc3QgdGFwdHJlZVNpYmxpbmdIYXNoIG9mIHBhdGgpIHtcbiAgICB0YXB0cmVlTWVya2xlSGFzaCA9XG4gICAgICBCdWZmZXIuY29tcGFyZSh0YXB0cmVlTWVya2xlSGFzaCwgdGFwdHJlZVNpYmxpbmdIYXNoKSA9PT0gLTFcbiAgICAgICAgPyBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVNZXJrbGVIYXNoLCB0YXB0cmVlU2libGluZ0hhc2hdKSlcbiAgICAgICAgOiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVTaWJsaW5nSGFzaCwgdGFwdHJlZU1lcmtsZUhhc2hdKSk7XG4gIH1cblxuICByZXR1cm4gdGFwdHJlZU1lcmtsZUhhc2g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUd2Vha2VkT3V0cHV0S2V5KHBheW1lbnQ6IGJwYXltZW50cy5QYXltZW50KTogQnVmZmVyIHtcbiAgYXNzZXJ0KHBheW1lbnQub3V0cHV0KTtcbiAgaWYgKHBheW1lbnQub3V0cHV0Lmxlbmd0aCA9PT0gMzQpIHtcbiAgICByZXR1cm4gcGF5bWVudC5vdXRwdXQ/LnN1YmFycmF5KDIpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBwMnRyIHR3ZWFrZWQgb3V0cHV0IGtleSBzaXplICR7cGF5bWVudC5vdXRwdXQubGVuZ3RofWApO1xufVxuIl19
@@ -1,4 +0,0 @@
1
- import * as input from './input';
2
- import * as output from './output';
3
- export { input, output };
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC"}
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.output = exports.input = void 0;
4
- const input = require("./input");
5
- exports.input = input;
6
- const output = require("./output");
7
- exports.output = output;
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL211bHRpc2lnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUFpQztBQUd4QixzQkFBSztBQUZkLG1DQUFtQztBQUVuQix3QkFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGlucHV0IGZyb20gJy4vaW5wdXQnO1xuaW1wb3J0ICogYXMgb3V0cHV0IGZyb20gJy4vb3V0cHV0JztcblxuZXhwb3J0IHsgaW5wdXQsIG91dHB1dCB9O1xuIl19
@@ -1,7 +0,0 @@
1
- /// <reference types="node" />
2
- import { Stack } from '../../';
3
- export declare function check(script: Buffer | Stack, allowIncomplete?: boolean): boolean;
4
- export declare namespace check {
5
- var toJSON: () => string;
6
- }
7
- //# sourceMappingURL=input.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/input.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAQ/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAUhF;yBAVe,KAAK"}
@@ -1,25 +0,0 @@
1
- "use strict";
2
- // OP_0 [signatures ...]
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.check = void 0;
5
- const __1 = require("../../");
6
- const __2 = require("../../");
7
- function partialSignature(value) {
8
- return value === __2.opcodes.OP_0 || __1.script.isCanonicalScriptSignature(value);
9
- }
10
- function check(script, allowIncomplete) {
11
- const chunks = __1.script.decompile(script);
12
- if (chunks.length < 2)
13
- return false;
14
- if (chunks[0] !== __2.opcodes.OP_0)
15
- return false;
16
- if (allowIncomplete) {
17
- return chunks.slice(1).every(partialSignature);
18
- }
19
- return chunks.slice(1).every(__1.script.isCanonicalScriptSignature);
20
- }
21
- exports.check = check;
22
- check.toJSON = () => {
23
- return 'multisig input';
24
- };
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL211bHRpc2lnL2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3QkFBd0I7OztBQUd4Qiw4QkFBMkM7QUFDM0MsOEJBQWlDO0FBRWpDLFNBQVMsZ0JBQWdCLENBQUMsS0FBc0I7SUFDOUMsT0FBTyxLQUFLLEtBQUssV0FBTyxDQUFDLElBQUksSUFBSSxVQUFPLENBQUMsMEJBQTBCLENBQUMsS0FBZSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFDbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFPLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRTdDLElBQUksZUFBZSxFQUFFO1FBQ25CLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUNoRDtJQUVELE9BQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQWMsQ0FBQyxLQUFLLENBQUMsVUFBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDakYsQ0FBQztBQVZELHNCQVVDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBPUF8wIFtzaWduYXR1cmVzIC4uLl1cblxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgb3Bjb2RlcyB9IGZyb20gJy4uLy4uLyc7XG5cbmZ1bmN0aW9uIHBhcnRpYWxTaWduYXR1cmUodmFsdWU6IG51bWJlciB8IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgPT09IG9wY29kZXMuT1BfMCB8fCBic2NyaXB0LmlzQ2Fub25pY2FsU2NyaXB0U2lnbmF0dXJlKHZhbHVlIGFzIEJ1ZmZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhzY3JpcHQ6IEJ1ZmZlciB8IFN0YWNrLCBhbGxvd0luY29tcGxldGU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHNjcmlwdCkgYXMgU3RhY2s7XG4gIGlmIChjaHVua3MubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuICBpZiAoY2h1bmtzWzBdICE9PSBvcGNvZGVzLk9QXzApIHJldHVybiBmYWxzZTtcblxuICBpZiAoYWxsb3dJbmNvbXBsZXRlKSB7XG4gICAgcmV0dXJuIGNodW5rcy5zbGljZSgxKS5ldmVyeShwYXJ0aWFsU2lnbmF0dXJlKTtcbiAgfVxuXG4gIHJldHVybiAoY2h1bmtzLnNsaWNlKDEpIGFzIEJ1ZmZlcltdKS5ldmVyeShic2NyaXB0LmlzQ2Fub25pY2FsU2NyaXB0U2lnbmF0dXJlKTtcbn1cbmNoZWNrLnRvSlNPTiA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gJ211bHRpc2lnIGlucHV0Jztcbn07XG4iXX0=
@@ -1,7 +0,0 @@
1
- /// <reference types="node" />
2
- import { Stack } from '../../';
3
- export declare function check(script: Buffer | Stack, allowIncomplete?: boolean): boolean;
4
- export declare namespace check {
5
- var toJSON: () => string;
6
- }
7
- //# sourceMappingURL=output.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/output.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAM/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAkBhF;yBAlBe,KAAK"}
@@ -1,38 +0,0 @@
1
- "use strict";
2
- // m [pubKeys ...] n OP_CHECKMULTISIG
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.check = void 0;
5
- const __1 = require("../../");
6
- const __2 = require("../../");
7
- const types = require("bitcoinjs-lib/src/types");
8
- const OP_INT_BASE = __2.opcodes.OP_RESERVED; // OP_1 - 1
9
- function check(script, allowIncomplete) {
10
- const chunks = __1.script.decompile(script);
11
- if (chunks.length < 4)
12
- return false;
13
- if (chunks[chunks.length - 1] !== __2.opcodes.OP_CHECKMULTISIG)
14
- return false;
15
- if (!types.Number(chunks[0]))
16
- return false;
17
- if (!types.Number(chunks[chunks.length - 2]))
18
- return false;
19
- const m = chunks[0] - OP_INT_BASE;
20
- const n = chunks[chunks.length - 2] - OP_INT_BASE;
21
- if (m <= 0)
22
- return false;
23
- if (n > 16)
24
- return false;
25
- if (m > n)
26
- return false;
27
- if (n !== chunks.length - 3)
28
- return false;
29
- if (allowIncomplete)
30
- return true;
31
- const keys = chunks.slice(1, -2);
32
- return keys.every(__1.script.isCanonicalPubKey);
33
- }
34
- exports.check = check;
35
- check.toJSON = () => {
36
- return 'multi-sig output';
37
- };
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RlbXBsYXRlcy9tdWx0aXNpZy9vdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHFDQUFxQzs7O0FBR3JDLDhCQUEyQztBQUMzQyw4QkFBaUM7QUFDakMsaURBQWlEO0FBQ2pELE1BQU0sV0FBVyxHQUFHLFdBQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXO0FBRXBELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFFbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxHQUFJLE1BQU0sQ0FBQyxDQUFDLENBQVksR0FBRyxXQUFXLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFZLEdBQUcsV0FBVyxDQUFDO0lBRTlELElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFDLElBQUksZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFhLENBQUM7SUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFsQkQsc0JBa0JDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBtIFtwdWJLZXlzIC4uLl0gbiBPUF9DSEVDS01VTFRJU0lHXG5cbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0IH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IG9wY29kZXMgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvdHlwZXMnO1xuY29uc3QgT1BfSU5UX0JBU0UgPSBvcGNvZGVzLk9QX1JFU0VSVkVEOyAvLyBPUF8xIC0gMVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2soc2NyaXB0OiBCdWZmZXIgfCBTdGFjaywgYWxsb3dJbmNvbXBsZXRlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBjaHVua3MgPSBic2NyaXB0LmRlY29tcGlsZShzY3JpcHQpIGFzIFN0YWNrO1xuXG4gIGlmIChjaHVua3MubGVuZ3RoIDwgNCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAxXSAhPT0gb3Bjb2Rlcy5PUF9DSEVDS01VTFRJU0lHKSByZXR1cm4gZmFsc2U7XG4gIGlmICghdHlwZXMuTnVtYmVyKGNodW5rc1swXSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCF0eXBlcy5OdW1iZXIoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAyXSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbSA9IChjaHVua3NbMF0gYXMgbnVtYmVyKSAtIE9QX0lOVF9CQVNFO1xuICBjb25zdCBuID0gKGNodW5rc1tjaHVua3MubGVuZ3RoIC0gMl0gYXMgbnVtYmVyKSAtIE9QX0lOVF9CQVNFO1xuXG4gIGlmIChtIDw9IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKG4gPiAxNikgcmV0dXJuIGZhbHNlO1xuICBpZiAobSA+IG4pIHJldHVybiBmYWxzZTtcbiAgaWYgKG4gIT09IGNodW5rcy5sZW5ndGggLSAzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhbGxvd0luY29tcGxldGUpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IGtleXMgPSBjaHVua3Muc2xpY2UoMSwgLTIpIGFzIEJ1ZmZlcltdO1xuICByZXR1cm4ga2V5cy5ldmVyeShic2NyaXB0LmlzQ2Fub25pY2FsUHViS2V5KTtcbn1cbmNoZWNrLnRvSlNPTiA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gJ211bHRpLXNpZyBvdXRwdXQnO1xufTtcbiJdfQ==
@@ -1,10 +0,0 @@
1
- /// <reference types="node" />
2
- export declare function check(script: Buffer | Array<number | Buffer>): boolean;
3
- export declare namespace check {
4
- var toJSON: () => string;
5
- }
6
- declare const output: {
7
- check: typeof check;
8
- };
9
- export { output };
10
- //# sourceMappingURL=nulldata.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nulldata.d.ts","sourceRoot":"","sources":["../../../src/templates/nulldata.ts"],"names":[],"mappings":";AAIA,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAItE;yBAJe,KAAK;;;AASrB,QAAA,MAAM,MAAM;;CAAY,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.output = exports.check = void 0;
4
- // OP_RETURN {data}
5
- const __1 = require("../");
6
- const __2 = require("../");
7
- function check(script) {
8
- const buffer = __1.script.compile(script);
9
- return buffer.length > 1 && buffer[0] === __2.opcodes.OP_RETURN;
10
- }
11
- exports.check = check;
12
- check.toJSON = () => {
13
- return 'null data output';
14
- };
15
- const output = { check };
16
- exports.output = output;
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGVzL251bGxkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1CQUFtQjtBQUNuQiwyQkFBd0M7QUFDeEMsMkJBQThCO0FBRTlCLFNBQWdCLEtBQUssQ0FBQyxNQUF1QztJQUMzRCxNQUFNLE1BQU0sR0FBRyxVQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXZDLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxTQUFTLENBQUM7QUFDOUQsQ0FBQztBQUpELHNCQUlDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBRWhCLHdCQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gT1BfUkVUVVJOIHtkYXRhfVxuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLi8nO1xuaW1wb3J0IHsgb3Bjb2RlcyB9IGZyb20gJy4uLyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhzY3JpcHQ6IEJ1ZmZlciB8IEFycmF5PG51bWJlciB8IEJ1ZmZlcj4pOiBib29sZWFuIHtcbiAgY29uc3QgYnVmZmVyID0gYnNjcmlwdC5jb21waWxlKHNjcmlwdCk7XG5cbiAgcmV0dXJuIGJ1ZmZlci5sZW5ndGggPiAxICYmIGJ1ZmZlclswXSA9PT0gb3Bjb2Rlcy5PUF9SRVRVUk47XG59XG5jaGVjay50b0pTT04gPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuICdudWxsIGRhdGEgb3V0cHV0Jztcbn07XG5cbmNvbnN0IG91dHB1dCA9IHsgY2hlY2sgfTtcblxuZXhwb3J0IHsgb3V0cHV0IH07XG4iXX0=
@@ -1,4 +0,0 @@
1
- import * as input from './input';
2
- import * as output from './output';
3
- export { input, output };
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/templates/pubkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC"}
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.output = exports.input = void 0;
4
- const input = require("./input");
5
- exports.input = input;
6
- const output = require("./output");
7
- exports.output = output;
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL3B1YmtleS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBaUM7QUFHeEIsc0JBQUs7QUFGZCxtQ0FBbUM7QUFFbkIsd0JBQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBpbnB1dCBmcm9tICcuL2lucHV0JztcbmltcG9ydCAqIGFzIG91dHB1dCBmcm9tICcuL291dHB1dCc7XG5cbmV4cG9ydCB7IGlucHV0LCBvdXRwdXQgfTtcbiJdfQ==
@@ -1,7 +0,0 @@
1
- /// <reference types="node" />
2
- import { Stack } from '../../';
3
- export declare function check(script: Buffer | Stack): boolean;
4
- export declare namespace check {
5
- var toJSON: () => string;
6
- }
7
- //# sourceMappingURL=input.d.ts.map