utxo-lib 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (249) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/src/address.d.ts +11 -0
  4. package/dist/src/address.d.ts.map +1 -0
  5. package/dist/src/address.js +37 -0
  6. package/dist/src/addressFormat.d.ts +53 -0
  7. package/dist/src/addressFormat.d.ts.map +1 -0
  8. package/dist/src/addressFormat.js +110 -0
  9. package/dist/src/bitgo/Musig2.d.ts +51 -0
  10. package/dist/src/bitgo/Musig2.d.ts.map +1 -0
  11. package/dist/src/bitgo/Musig2.js +175 -0
  12. package/dist/src/bitgo/Unspent.d.ts +95 -0
  13. package/dist/src/bitgo/Unspent.d.ts.map +1 -0
  14. package/dist/src/bitgo/Unspent.js +138 -0
  15. package/dist/src/bitgo/UtxoPsbt.d.ts +132 -0
  16. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -0
  17. package/dist/src/bitgo/UtxoPsbt.js +469 -0
  18. package/dist/src/bitgo/UtxoTransaction.d.ts +22 -0
  19. package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -0
  20. package/dist/src/bitgo/UtxoTransaction.js +97 -0
  21. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +26 -0
  22. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -0
  23. package/dist/src/bitgo/UtxoTransactionBuilder.js +67 -0
  24. package/dist/src/bitgo/bbc/DashPsbt.d.ts +12 -0
  25. package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +1 -0
  26. package/dist/src/bitgo/bbc/DashPsbt.js +27 -0
  27. package/dist/src/bitgo/bbc/DashTransaction.d.ts +39 -0
  28. package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +1 -0
  29. package/dist/src/bitgo/bbc/DashTransaction.js +109 -0
  30. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +14 -0
  31. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +1 -0
  32. package/dist/src/bitgo/bbc/DashTransactionBuilder.js +28 -0
  33. package/dist/src/bitgo/bbc/index.d.ts +4 -0
  34. package/dist/src/bitgo/bbc/index.d.ts.map +1 -0
  35. package/dist/src/bitgo/bbc/index.js +16 -0
  36. package/dist/src/bitgo/bitcoincash/address.d.ts +35 -0
  37. package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -0
  38. package/dist/src/bitgo/bitcoincash/address.js +151 -0
  39. package/dist/src/bitgo/bitcoincash/index.d.ts +2 -0
  40. package/dist/src/bitgo/bitcoincash/index.d.ts.map +1 -0
  41. package/dist/src/bitgo/bitcoincash/index.js +14 -0
  42. package/dist/src/bitgo/dash/DashPsbt.d.ts +12 -0
  43. package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -0
  44. package/dist/src/bitgo/dash/DashPsbt.js +27 -0
  45. package/dist/src/bitgo/dash/DashTransaction.d.ts +39 -0
  46. package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -0
  47. package/dist/src/bitgo/dash/DashTransaction.js +109 -0
  48. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +14 -0
  49. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -0
  50. package/dist/src/bitgo/dash/DashTransactionBuilder.js +28 -0
  51. package/dist/src/bitgo/dash/index.d.ts +4 -0
  52. package/dist/src/bitgo/dash/index.d.ts.map +1 -0
  53. package/dist/src/bitgo/dash/index.js +16 -0
  54. package/dist/src/bitgo/index.d.ts +17 -0
  55. package/dist/src/bitgo/index.d.ts.map +1 -0
  56. package/dist/src/bitgo/index.js +30 -0
  57. package/dist/src/bitgo/keyutil.d.ts +17 -0
  58. package/dist/src/bitgo/keyutil.d.ts.map +1 -0
  59. package/dist/src/bitgo/keyutil.js +37 -0
  60. package/dist/src/bitgo/nonStandardHalfSigned.d.ts +7 -0
  61. package/dist/src/bitgo/nonStandardHalfSigned.d.ts.map +1 -0
  62. package/dist/src/bitgo/nonStandardHalfSigned.js +56 -0
  63. package/dist/src/bitgo/outputScripts.d.ts +84 -0
  64. package/dist/src/bitgo/outputScripts.d.ts.map +1 -0
  65. package/dist/src/bitgo/outputScripts.js +297 -0
  66. package/dist/src/bitgo/parseInput.d.ts +92 -0
  67. package/dist/src/bitgo/parseInput.d.ts.map +1 -0
  68. package/dist/src/bitgo/parseInput.js +344 -0
  69. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +24 -0
  70. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -0
  71. package/dist/src/bitgo/psbt/fromHalfSigned.js +91 -0
  72. package/dist/src/bitgo/psbt/scriptTypes.d.ts +6 -0
  73. package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -0
  74. package/dist/src/bitgo/psbt/scriptTypes.js +23 -0
  75. package/dist/src/bitgo/signature.d.ts +84 -0
  76. package/dist/src/bitgo/signature.d.ts.map +1 -0
  77. package/dist/src/bitgo/signature.js +222 -0
  78. package/dist/src/bitgo/tnumber.d.ts +9 -0
  79. package/dist/src/bitgo/tnumber.d.ts.map +1 -0
  80. package/dist/src/bitgo/tnumber.js +31 -0
  81. package/dist/src/bitgo/transaction.d.ts +29 -0
  82. package/dist/src/bitgo/transaction.d.ts.map +1 -0
  83. package/dist/src/bitgo/transaction.js +247 -0
  84. package/dist/src/bitgo/types.d.ts +5 -0
  85. package/dist/src/bitgo/types.d.ts.map +1 -0
  86. package/dist/src/bitgo/types.js +12 -0
  87. package/dist/src/bitgo/wallet/Psbt.d.ts +47 -0
  88. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -0
  89. package/dist/src/bitgo/wallet/Psbt.js +232 -0
  90. package/dist/src/bitgo/wallet/Unspent.d.ts +47 -0
  91. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -0
  92. package/dist/src/bitgo/wallet/Unspent.js +154 -0
  93. package/dist/src/bitgo/wallet/WalletKeys.d.ts +72 -0
  94. package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -0
  95. package/dist/src/bitgo/wallet/WalletKeys.js +104 -0
  96. package/dist/src/bitgo/wallet/WalletOutput.d.ts +18 -0
  97. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -0
  98. package/dist/src/bitgo/wallet/WalletOutput.js +69 -0
  99. package/dist/src/bitgo/wallet/WalletScripts.d.ts +7 -0
  100. package/dist/src/bitgo/wallet/WalletScripts.d.ts.map +1 -0
  101. package/dist/src/bitgo/wallet/WalletScripts.js +15 -0
  102. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +19 -0
  103. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +1 -0
  104. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +47 -0
  105. package/dist/src/bitgo/wallet/chains.d.ts +57 -0
  106. package/dist/src/bitgo/wallet/chains.d.ts.map +1 -0
  107. package/dist/src/bitgo/wallet/chains.js +106 -0
  108. package/dist/src/bitgo/wallet/index.d.ts +8 -0
  109. package/dist/src/bitgo/wallet/index.d.ts.map +1 -0
  110. package/dist/src/bitgo/wallet/index.js +20 -0
  111. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +26 -0
  112. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -0
  113. package/dist/src/bitgo/zcash/ZcashBufferutils.js +157 -0
  114. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +36 -0
  115. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -0
  116. package/dist/src/bitgo/zcash/ZcashPsbt.js +146 -0
  117. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +61 -0
  118. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -0
  119. package/dist/src/bitgo/zcash/ZcashTransaction.js +341 -0
  120. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +21 -0
  121. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -0
  122. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +105 -0
  123. package/dist/src/bitgo/zcash/address.d.ts +8 -0
  124. package/dist/src/bitgo/zcash/address.d.ts.map +1 -0
  125. package/dist/src/bitgo/zcash/address.js +57 -0
  126. package/dist/src/bitgo/zcash/hashZip0244.d.ts +27 -0
  127. package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -0
  128. package/dist/src/bitgo/zcash/hashZip0244.js +184 -0
  129. package/dist/src/bitgo/zcash/index.d.ts +4 -0
  130. package/dist/src/bitgo/zcash/index.d.ts.map +1 -0
  131. package/dist/src/bitgo/zcash/index.js +16 -0
  132. package/dist/src/classify.d.ts +19 -0
  133. package/dist/src/classify.d.ts.map +1 -0
  134. package/dist/src/classify.js +89 -0
  135. package/dist/src/index.d.ts +13 -0
  136. package/dist/src/index.d.ts.map +1 -0
  137. package/dist/src/index.js +36 -0
  138. package/dist/src/networks.d.ts +119 -0
  139. package/dist/src/networks.d.ts.map +1 -0
  140. package/dist/src/networks.js +477 -0
  141. package/dist/src/noble_ecc.d.ts +28 -0
  142. package/dist/src/noble_ecc.d.ts.map +1 -0
  143. package/dist/src/noble_ecc.js +168 -0
  144. package/dist/src/payments/index.d.ts +4 -0
  145. package/dist/src/payments/index.d.ts.map +1 -0
  146. package/dist/src/payments/index.js +8 -0
  147. package/dist/src/payments/p2tr.d.ts +3 -0
  148. package/dist/src/payments/p2tr.d.ts.map +1 -0
  149. package/dist/src/payments/p2tr.js +348 -0
  150. package/dist/src/payments/p2tr_ns.d.ts +3 -0
  151. package/dist/src/payments/p2tr_ns.d.ts.map +1 -0
  152. package/dist/src/payments/p2tr_ns.js +134 -0
  153. package/dist/src/taproot.d.ts +141 -0
  154. package/dist/src/taproot.d.ts.map +1 -0
  155. package/dist/src/taproot.js +384 -0
  156. package/dist/src/templates/multisig/index.d.ts +4 -0
  157. package/dist/src/templates/multisig/index.d.ts.map +1 -0
  158. package/dist/src/templates/multisig/index.js +8 -0
  159. package/dist/src/templates/multisig/input.d.ts +7 -0
  160. package/dist/src/templates/multisig/input.d.ts.map +1 -0
  161. package/dist/src/templates/multisig/input.js +25 -0
  162. package/dist/src/templates/multisig/output.d.ts +7 -0
  163. package/dist/src/templates/multisig/output.d.ts.map +1 -0
  164. package/dist/src/templates/multisig/output.js +38 -0
  165. package/dist/src/templates/nulldata.d.ts +10 -0
  166. package/dist/src/templates/nulldata.d.ts.map +1 -0
  167. package/dist/src/templates/nulldata.js +17 -0
  168. package/dist/src/templates/pubkey/index.d.ts +4 -0
  169. package/dist/src/templates/pubkey/index.d.ts.map +1 -0
  170. package/dist/src/templates/pubkey/index.js +8 -0
  171. package/dist/src/templates/pubkey/input.d.ts +7 -0
  172. package/dist/src/templates/pubkey/input.d.ts.map +1 -0
  173. package/dist/src/templates/pubkey/input.js +14 -0
  174. package/dist/src/templates/pubkey/output.d.ts +7 -0
  175. package/dist/src/templates/pubkey/output.d.ts.map +1 -0
  176. package/dist/src/templates/pubkey/output.js +15 -0
  177. package/dist/src/templates/pubkeyhash/index.d.ts +4 -0
  178. package/dist/src/templates/pubkeyhash/index.d.ts.map +1 -0
  179. package/dist/src/templates/pubkeyhash/index.js +8 -0
  180. package/dist/src/templates/pubkeyhash/input.d.ts +7 -0
  181. package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -0
  182. package/dist/src/templates/pubkeyhash/input.js +16 -0
  183. package/dist/src/templates/pubkeyhash/output.d.ts +6 -0
  184. package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -0
  185. package/dist/src/templates/pubkeyhash/output.js +20 -0
  186. package/dist/src/templates/scripthash/index.d.ts +4 -0
  187. package/dist/src/templates/scripthash/index.d.ts.map +1 -0
  188. package/dist/src/templates/scripthash/index.js +8 -0
  189. package/dist/src/templates/scripthash/input.d.ts +6 -0
  190. package/dist/src/templates/scripthash/input.d.ts.map +1 -0
  191. package/dist/src/templates/scripthash/input.js +43 -0
  192. package/dist/src/templates/scripthash/output.d.ts +6 -0
  193. package/dist/src/templates/scripthash/output.d.ts.map +1 -0
  194. package/dist/src/templates/scripthash/output.js +15 -0
  195. package/dist/src/templates/taproot/index.d.ts +4 -0
  196. package/dist/src/templates/taproot/index.d.ts.map +1 -0
  197. package/dist/src/templates/taproot/index.js +8 -0
  198. package/dist/src/templates/taproot/input.d.ts +6 -0
  199. package/dist/src/templates/taproot/input.d.ts.map +1 -0
  200. package/dist/src/templates/taproot/input.js +23 -0
  201. package/dist/src/templates/taproot/output.d.ts +6 -0
  202. package/dist/src/templates/taproot/output.d.ts.map +1 -0
  203. package/dist/src/templates/taproot/output.js +15 -0
  204. package/dist/src/templates/taprootnofn/index.d.ts +4 -0
  205. package/dist/src/templates/taprootnofn/index.d.ts.map +1 -0
  206. package/dist/src/templates/taprootnofn/index.js +8 -0
  207. package/dist/src/templates/taprootnofn/input.d.ts +7 -0
  208. package/dist/src/templates/taprootnofn/input.d.ts.map +1 -0
  209. package/dist/src/templates/taprootnofn/input.js +24 -0
  210. package/dist/src/templates/taprootnofn/output.d.ts +7 -0
  211. package/dist/src/templates/taprootnofn/output.d.ts.map +1 -0
  212. package/dist/src/templates/taprootnofn/output.js +28 -0
  213. package/dist/src/templates/witnesscommitment/index.d.ts +3 -0
  214. package/dist/src/templates/witnesscommitment/index.d.ts.map +1 -0
  215. package/dist/src/templates/witnesscommitment/index.js +6 -0
  216. package/dist/src/templates/witnesscommitment/output.d.ts +8 -0
  217. package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -0
  218. package/dist/src/templates/witnesscommitment/output.js +31 -0
  219. package/dist/src/templates/witnesspubkeyhash/index.d.ts +4 -0
  220. package/dist/src/templates/witnesspubkeyhash/index.d.ts.map +1 -0
  221. package/dist/src/templates/witnesspubkeyhash/index.js +8 -0
  222. package/dist/src/templates/witnesspubkeyhash/input.d.ts +7 -0
  223. package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -0
  224. package/dist/src/templates/witnesspubkeyhash/input.js +19 -0
  225. package/dist/src/templates/witnesspubkeyhash/output.d.ts +6 -0
  226. package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -0
  227. package/dist/src/templates/witnesspubkeyhash/output.js +15 -0
  228. package/dist/src/templates/witnessscripthash/index.d.ts +4 -0
  229. package/dist/src/templates/witnessscripthash/index.d.ts.map +1 -0
  230. package/dist/src/templates/witnessscripthash/index.js +8 -0
  231. package/dist/src/templates/witnessscripthash/input.d.ts +6 -0
  232. package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -0
  233. package/dist/src/templates/witnessscripthash/input.js +35 -0
  234. package/dist/src/templates/witnessscripthash/output.d.ts +6 -0
  235. package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -0
  236. package/dist/src/templates/witnessscripthash/output.js +15 -0
  237. package/dist/src/testutil/index.d.ts +3 -0
  238. package/dist/src/testutil/index.d.ts.map +1 -0
  239. package/dist/src/testutil/index.js +15 -0
  240. package/dist/src/testutil/keys.d.ts +10 -0
  241. package/dist/src/testutil/keys.d.ts.map +1 -0
  242. package/dist/src/testutil/keys.js +40 -0
  243. package/dist/src/testutil/mock.d.ts +21 -0
  244. package/dist/src/testutil/mock.d.ts.map +1 -0
  245. package/dist/src/testutil/mock.js +86 -0
  246. package/dist/src/transaction_builder.d.ts +47 -0
  247. package/dist/src/transaction_builder.d.ts.map +1 -0
  248. package/dist/src/transaction_builder.js +1084 -0
  249. package/package.json +87 -0
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.p2tr_ns = void 0;
4
+ const networks_1 = require("../networks");
5
+ const bitcoinjs_lib_1 = require("bitcoinjs-lib");
6
+ const OPS = bitcoinjs_lib_1.script.OPS;
7
+ const typef = require('typeforce');
8
+ const BITCOIN_NETWORK = networks_1.networks.bitcoin;
9
+ function stacksEqual(a, b) {
10
+ if (a.length !== b.length)
11
+ return false;
12
+ return a.every((x, i) => {
13
+ return x.equals(b[i]);
14
+ });
15
+ }
16
+ // input: [signatures ...]
17
+ // output: [pubKeys[0:n-1] OP_CHECKSIGVERIFY] pubKeys[n-1] OP_CHECKSIG
18
+ function p2tr_ns(a, opts) {
19
+ if (!a.input && !a.output && !(a.pubkeys && a.pubkeys.length) && !a.signatures) {
20
+ throw new TypeError('Not enough data');
21
+ }
22
+ opts = Object.assign({ validate: true }, opts || {});
23
+ if (!opts.eccLib)
24
+ throw new Error('ECC Library is required for p2tr_ns.');
25
+ const ecc = opts.eccLib;
26
+ function isAcceptableSignature(x) {
27
+ if (Buffer.isBuffer(x)) {
28
+ return (
29
+ // empty signatures may be represented as empty buffers
30
+ (opts && opts.allowIncomplete && x.length === 0) || bitcoinjs_lib_1.script.isCanonicalSchnorrSignature(x));
31
+ }
32
+ return !!(opts && opts.allowIncomplete && x === OPS.OP_0);
33
+ }
34
+ typef({
35
+ network: typef.maybe(typef.Object),
36
+ output: typef.maybe(typef.Buffer),
37
+ pubkeys: typef.maybe(typef.arrayOf(ecc.isXOnlyPoint)),
38
+ signatures: typef.maybe(typef.arrayOf(isAcceptableSignature)),
39
+ input: typef.maybe(typef.Buffer),
40
+ }, a);
41
+ const network = a.network || BITCOIN_NETWORK;
42
+ const o = { network };
43
+ const _chunks = bitcoinjs_lib_1.lazy.value(() => {
44
+ if (!a.output)
45
+ return;
46
+ return bitcoinjs_lib_1.script.decompile(a.output);
47
+ });
48
+ bitcoinjs_lib_1.lazy.prop(o, 'output', () => {
49
+ if (!a.pubkeys)
50
+ return;
51
+ return bitcoinjs_lib_1.script.compile([].concat(...a.pubkeys.map((pk, i, pks) => [pk, i === pks.length - 1 ? OPS.OP_CHECKSIG : OPS.OP_CHECKSIGVERIFY])));
52
+ });
53
+ bitcoinjs_lib_1.lazy.prop(o, 'n', () => {
54
+ if (!o.pubkeys)
55
+ return;
56
+ return o.pubkeys.length;
57
+ });
58
+ bitcoinjs_lib_1.lazy.prop(o, 'pubkeys', () => {
59
+ const chunks = _chunks();
60
+ if (!chunks)
61
+ return;
62
+ return chunks.filter((_, index) => index % 2 === 0);
63
+ });
64
+ bitcoinjs_lib_1.lazy.prop(o, 'signatures', () => {
65
+ var _a;
66
+ if (!a.input)
67
+ return;
68
+ return (_a = bitcoinjs_lib_1.script.decompile(a.input)) === null || _a === void 0 ? void 0 : _a.reverse();
69
+ });
70
+ bitcoinjs_lib_1.lazy.prop(o, 'input', () => {
71
+ if (!a.signatures)
72
+ return;
73
+ return bitcoinjs_lib_1.script.compile([...a.signatures].reverse());
74
+ });
75
+ bitcoinjs_lib_1.lazy.prop(o, 'witness', () => {
76
+ if (!o.input)
77
+ return;
78
+ return [];
79
+ });
80
+ bitcoinjs_lib_1.lazy.prop(o, 'name', () => {
81
+ if (!o.n)
82
+ return;
83
+ return `p2tr_ns(${o.n})`;
84
+ });
85
+ // extended validation
86
+ if (opts.validate) {
87
+ const chunks = _chunks();
88
+ if (chunks) {
89
+ if (chunks[chunks.length - 1] !== OPS.OP_CHECKSIG) {
90
+ throw new TypeError('Output ends with unexpected opcode');
91
+ }
92
+ if (chunks
93
+ .filter((_, index) => index % 2 === 1)
94
+ .slice(0, -1)
95
+ .some((op) => op !== OPS.OP_CHECKSIGVERIFY)) {
96
+ throw new TypeError('Output contains unexpected opcode');
97
+ }
98
+ if (o.n > 16 || o.n !== chunks.length / 2) {
99
+ throw new TypeError('Output contains too many pubkeys');
100
+ }
101
+ if (o.pubkeys.some((x) => !ecc.isXOnlyPoint(x))) {
102
+ throw new TypeError('Output contains invalid pubkey(s)');
103
+ }
104
+ if (a.pubkeys && !stacksEqual(a.pubkeys, o.pubkeys)) {
105
+ throw new TypeError('Pubkeys mismatch');
106
+ }
107
+ }
108
+ if (a.pubkeys && a.pubkeys.length) {
109
+ o.n = a.pubkeys.length;
110
+ }
111
+ if (a.signatures && o.n) {
112
+ if (a.signatures.length < o.n) {
113
+ throw new TypeError('Not enough signatures provided');
114
+ }
115
+ if (a.signatures.length > o.n) {
116
+ throw new TypeError('Too many signatures provided');
117
+ }
118
+ }
119
+ if (a.input) {
120
+ if (!o.signatures.every(isAcceptableSignature)) {
121
+ throw new TypeError('Input has invalid signature(s)');
122
+ }
123
+ if (a.signatures && !stacksEqual(a.signatures, o.signatures)) {
124
+ throw new TypeError('Signature mismatch');
125
+ }
126
+ if (o.n !== o.signatures.length) {
127
+ throw new TypeError(`Signature count mismatch (n: ${o.n}, signatures.length: ${o.signatures.length}`);
128
+ }
129
+ }
130
+ }
131
+ return Object.assign(o, a);
132
+ }
133
+ exports.p2tr_ns = p2tr_ns;
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicDJ0cl9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXltZW50cy9wMnRyX25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBDQUF1QztBQUN2QyxpREFBcUY7QUFFckYsTUFBTSxHQUFHLEdBQUcsc0JBQU8sQ0FBQyxHQUFHLENBQUM7QUFDeEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRW5DLE1BQU0sZUFBZSxHQUFHLG1CQUFRLENBQUMsT0FBTyxDQUFDO0FBRXpDLFNBQVMsV0FBVyxDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzNDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXhDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsMEJBQTBCO0FBQzFCLHNFQUFzRTtBQUN0RSxTQUFnQixPQUFPLENBQUMsQ0FBVSxFQUFFLElBQWtCO0lBQ3BELElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRTtRQUM5RSxNQUFNLElBQUksU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FDeEM7SUFDRCxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFFckQsSUFBSSxDQUFD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RCxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN2QixJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sSUFBSSxTQUFTLENBQUMsZ0NBQWdDLENBQUMsQ0FBQzthQUN2RDtZQUNELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO2FBQ3JEO1NBQ0Y7UUFFRCxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDWCxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVcsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRTtnQkFDL0MsTUFBTSxJQUFJLFNBQVMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO2FBQ3ZEO1lBRUQsSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVcsQ0FBQyxFQUFFO2dCQUM3RCxNQUFNLElBQUksU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDM0M7WUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVcsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hDLE1BQU0sSUFBSSxTQUFTLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsVUFBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDeEc7U0FDRjtLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBaElELDBCQWdJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5ldHdvcmtzIH0gZnJvbSAnLi4vbmV0d29ya3MnO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQsIFBheW1lbnQsIFBheW1lbnRPcHRzLCBTdGFjaywgbGF6eSB9IGZyb20gJ2JpdGNvaW5qcy1saWInO1xuXG5jb25zdCBPUFMgPSBic2NyaXB0Lk9QUztcbmNvbnN0IHR5cGVmID0gcmVxdWlyZSgndHlwZWZvcmNlJyk7XG5cbmNvbnN0IEJJVENPSU5fTkVUV09SSyA9IG5ldHdvcmtzLmJpdGNvaW47XG5cbmZ1bmN0aW9uIHN0YWNrc0VxdWFsKGE6IEJ1ZmZlcltdLCBiOiBCdWZmZXJbXSk6IGJvb2xlYW4ge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGEuZXZlcnkoKHgsIGkpID0+IHtcbiAgICByZXR1cm4geC5lcXVhbHMoYltpXSk7XG4gIH0pO1xufVxuXG4vLyBpbnB1dDogW3NpZ25hdHVyZXMgLi4uXVxuLy8gb3V0cHV0OiBbcHViS2V5c1swOm4tMV0gT1BfQ0hFQ0tTSUdWRVJJRlldIHB1YktleXNbbi0xXSBPUF9DSEVDS1NJR1xuZXhwb3J0IGZ1bmN0aW9uIHAydHJfbnMoYTogUGF5bWVudCwgb3B0cz86IFBheW1lbnRPcHRzKTogUGF5bWVudCB7XG4gIGlmICghYS5pbnB1dCAmJiAhYS5vdXRwdXQgJiYgIShhLnB1YmtleXMgJiYgYS5wdWJrZXlzLmxlbmd0aCkgJiYgIWEuc2lnbmF0dXJlcykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vdCBlbm91Z2ggZGF0YScpO1xuICB9XG4gIG9wdHMgPSBPYmplY3QuYXNzaWduKHsgdmFsaWRhdGU6IHRydWUgfSwgb3B0cyB8fCB7fSk7XG5cbiAgaWYgKCFvcHRzLmVjY0xpYikgdGhyb3cgbmV3IEVycm9yKCdFQ0MgTGlicmFyeSBpcyByZXF1aXJlZCBmb3IgcDJ0cl9ucy4nKTtcbiAgY29uc3QgZWNjID0gb3B0cy5lY2NMaWI7XG5cbiAgZnVuY3Rpb24gaXNBY2NlcHRhYmxlU2lnbmF0dXJlKHg6IEJ1ZmZlciB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoeCkpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC8vIGVtcHR5IHNpZ25hdHVyZXMgbWF5IGJlIHJlcHJlc2VudGVkIGFzIGVtcHR5IGJ1ZmZlcnNcbiAgICAgICAgKG9wdHMgJiYgb3B0cy5hbGxvd0luY29tcGxldGUgJiYgeC5sZW5ndGggPT09IDApIHx8IGJzY3JpcHQuaXNDYW5vbmljYWxTY2hub3JyU2lnbmF0dXJlKHgpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gISEob3B0cyAmJiBvcHRzLmFsbG93SW5jb21wbGV0ZSAmJiB4ID09PSBPUFMuT1BfMCk7XG4gIH1cblxuICB0eXBlZihcbiAgICB7XG4gICAgICBuZXR3b3JrOiB0eXBlZi5tYXliZSh0eXBlZi5PYmplY3QpLFxuICAgICAgb3V0cHV0OiB0eXBlZi5tYXliZSh0eXBlZi5CdWZmZXIpLFxuICAgICAgcHVia2V5czogdHlwZWYubWF5YmUodHlwZWYuYXJyYXlPZihlY2MuaXNYT25seVBvaW50KSksXG5cbiAgICAgIHNpZ25hdHVyZXM6IHR5cGVmLm1heWJlKHR5cGVmLmFycmF5T2YoaXNBY2NlcHRhYmxlU2lnbmF0dXJlKSksXG4gICAgICBpbnB1dDogdHlwZWYubWF5YmUodHlwZWYuQnVmZmVyKSxcbiAgICB9LFxuICAgIGFcbiAgKTtcblxuICBjb25zdCBuZXR3b3JrID0gYS5uZXR3b3JrIHx8IEJJVENPSU5fTkVUV09SSztcbiAgY29uc3QgbzogUGF5bWVudCA9IHsgbmV0d29yayB9O1xuXG4gIGNvbnN0IF9jaHVua3MgPSBsYXp5LnZhbHVlKCgpID0+IHtcbiAgICBpZiAoIWEub3V0cHV0KSByZXR1cm47XG4gICAgcmV0dXJuIGJzY3JpcHQuZGVjb21waWxlKGEub3V0cHV0KSBhcyBTdGFjaztcbiAgfSk7XG5cbiAgbGF6eS5wcm9wKG8sICdvdXRwdXQnLCAoKSA9PiB7XG4gICAgaWYgKCFhLnB1YmtleXMpIHJldHVybjtcbiAgICByZXR1cm4gYnNjcmlwdC5jb21waWxlKFxuICAgICAgKFtdIGFzIFN0YWNrKS5jb25jYXQoXG4gICAgICAgIC4uLmEucHVia2V5cy5tYXAoKHBrLCBpLCBwa3MpID0+IFtwaywgaSA9PT0gcGtzLmxlbmd0aCAtIDEgPyBPUFMuT1BfQ0hFQ0tTSUcgOiBPUFMuT1BfQ0hFQ0tTSUdWRVJJRlldKVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xuICBsYXp5LnByb3AobywgJ24nLCAoKSA9PiB7XG4gICAgaWYgKCFvLnB1YmtleXMpIHJldHVybjtcbiAgICByZXR1cm4gby5wdWJrZXlzLmxlbmd0aDtcbiAgfSk7XG4gIGxhenkucHJvcChvLCAncHVia2V5cycsICgpID0+IHtcbiAgICBjb25zdCBjaHVua3MgPSBfY2h1bmtzKCk7XG4gICAgaWYgKCFjaHVua3MpIHJldHVybjtcbiAgICByZXR1cm4gY2h1bmtzLmZpbHRlcigoXywgaW5kZXgpID0+IGluZGV4ICUgMiA9PT0gMCkgYXMgQnVmZmVyW107XG4gIH0pO1xuICBsYXp5LnByb3AobywgJ3NpZ25hdHVyZXMnLCAoKSA9PiB7XG4gICAgaWYgKCFhLmlucHV0KSByZXR1cm47XG4gICAgcmV0dXJuIGJzY3JpcHQuZGVjb21waWxlKGEuaW5wdXQpPy5yZXZlcnNlKCk7XG4gIH0pO1xuICBsYXp5LnByb3AobywgJ2lucHV0JywgKCkgPT4ge1xuICAgIGlmICghYS5zaWduYXR1cmVzKSByZXR1cm47XG4gICAgcmV0dXJuIGJzY3JpcHQuY29tcGlsZShbLi4uYS5zaWduYXR1cmVzXS5yZXZlcnNlKCkpO1xuICB9KTtcbiAgbGF6eS5wcm9wKG8sICd3aXRuZXNzJywgKCkgPT4ge1xuICAgIGlmICghby5pbnB1dCkgcmV0dXJuO1xuICAgIHJldHVybiBbXTtcbiAgfSk7XG4gIGxhenkucHJvcChvLCAnbmFtZScsICgpID0+IHtcbiAgICBpZiAoIW8ubikgcmV0dXJuO1xuICAgIHJldHVybiBgcDJ0cl9ucygke28ubn0pYDtcbiAgfSk7XG5cbiAgLy8gZXh0ZW5kZWQgdmFsaWRhdGlvblxuICBpZiAob3B0cy52YWxpZGF0ZSkge1xuICAgIGNvbnN0IGNodW5rcyA9IF9jaHVua3MoKTtcbiAgICBpZiAoY2h1bmtzKSB7XG4gICAgICBpZiAoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAxXSAhPT0gT1BTLk9QX0NIRUNLU0lHKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ091dHB1dCBlbmRzIHdpdGggdW5leHBlY3RlZCBvcGNvZGUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY2h1bmtzXG4gICAgICAgICAgLmZpbHRlcigoXywgaW5kZXgpID0+IGluZGV4ICUgMiA9PT0gMSlcbiAgICAgICAgICAuc2xpY2UoMCwgLTEpXG4gICAgICAgICAgLnNvbWUoKG9wKSA9PiBvcCAhPT0gT1BTLk9QX0NIRUNLU0lHVkVSSUZZKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ091dHB1dCBjb250YWlucyB1bmV4cGVjdGVkIG9wY29kZScpO1xuICAgICAgfVxuICAgICAgaWYgKG8ubiEgPiAxNiB8fCBvLm4gIT09IGNodW5rcy5sZW5ndGggLyAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ091dHB1dCBjb250YWlucyB0b28gbWFueSBwdWJrZXlzJyk7XG4gICAgICB9XG4gICAgICBpZiAoby5wdWJrZXlzIS5zb21lKCh4KSA9PiAhZWNjLmlzWE9ubHlQb2ludCh4KSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT3V0cHV0IGNvbnRhaW5zIGludmFsaWQgcHVia2V5KHMpJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhLnB1YmtleXMgJiYgIXN0YWNrc0VxdWFsKGEucHVia2V5cywgby5wdWJrZXlzISkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHVia2V5cyBtaXNtYXRjaCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLnB1YmtleXMgJiYgYS5wdWJrZXlzLmxlbmd0aCkge1xuICAgICAgby5uID0gYS5wdWJrZXlzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAoYS5zaWduYXR1cmVzICYmIG8ubikge1xuICAgICAgaWYgKGEuc2lnbmF0dXJlcy5sZW5ndGggPCBvLm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTm90IGVub3VnaCBzaWduYXR1cmVzIHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICBpZiAoYS5zaWduYXR1cmVzLmxlbmd0aCA+IG8ubikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUb28gbWFueSBzaWduYXR1cmVzIHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGEuaW5wdXQpIHtcbiAgICAgIGlmICghby5zaWduYXR1cmVzIS5ldmVyeShpc0FjY2VwdGFibGVTaWduYXR1cmUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lucHV0IGhhcyBpbnZhbGlkIHNpZ25hdHVyZShzKScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYS5zaWduYXR1cmVzICYmICFzdGFja3NFcXVhbChhLnNpZ25hdHVyZXMsIG8uc2lnbmF0dXJlcyEpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NpZ25hdHVyZSBtaXNtYXRjaCcpO1xuICAgICAgfVxuICAgICAgaWYgKG8ubiAhPT0gby5zaWduYXR1cmVzIS5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU2lnbmF0dXJlIGNvdW50IG1pc21hdGNoIChuOiAke28ubn0sIHNpZ25hdHVyZXMubGVuZ3RoOiAke28uc2lnbmF0dXJlcyEubGVuZ3RofWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKG8sIGEpO1xufVxuIl19
@@ -0,0 +1,141 @@
1
+ /// <reference types="node" />
2
+ import { TapTree as PsbtTapTree } from 'bip174/src/lib/interfaces';
3
+ import { payments as bpayments } from 'bitcoinjs-lib';
4
+ /**
5
+ * The 0x02 prefix indicating an even Y coordinate which is implicitly assumed
6
+ * on all 32 byte x-only pub keys as defined in BIP340.
7
+ */
8
+ export declare const EVEN_Y_COORD_PREFIX: Buffer;
9
+ export declare const INITIAL_TAPSCRIPT_VERSION = 192;
10
+ export interface TinySecp256k1Interface {
11
+ isXOnlyPoint(p: Uint8Array): boolean;
12
+ xOnlyPointAddTweak(p: Uint8Array, tweak: Uint8Array): XOnlyPointAddTweakResult | null;
13
+ pointFromScalar(sk: Uint8Array, compressed?: boolean): Uint8Array | null;
14
+ pointMultiply(a: Uint8Array, b: Uint8Array): Uint8Array | null;
15
+ pointAdd(a: Uint8Array, b: Uint8Array): Uint8Array | null;
16
+ privateAdd(d: Uint8Array, tweak: Uint8Array): Uint8Array | null;
17
+ privateNegate(d: Uint8Array): Uint8Array;
18
+ }
19
+ /**
20
+ * Aggregates a list of public keys into a single MuSig2* public key
21
+ * according to the MuSig2 paper.
22
+ * @param ecc Elliptic curve implementation
23
+ * @param pubkeys The list of pub keys to aggregate
24
+ * @returns a 32 byte Buffer representing the aggregate key
25
+ */
26
+ export declare function aggregateMuSigPubkeys(ecc: TinySecp256k1Interface, pubkeys: Buffer[]): Uint8Array;
27
+ /**
28
+ * Encodes the length of a script as a bitcoin variable length integer.
29
+ * @param script
30
+ * @returns
31
+ */
32
+ export declare function serializeScriptSize(script: Buffer): Buffer;
33
+ /**
34
+ * Gets a tapleaf tagged hash from a script.
35
+ * @param script
36
+ * @returns
37
+ */
38
+ export declare function hashTapLeaf(script: Buffer, leafVersion?: number): Buffer;
39
+ /**
40
+ * Creates a lexicographically sorted tapbranch from two child taptree nodes
41
+ * and returns its tagged hash.
42
+ * @param child1
43
+ * @param child2
44
+ * @returns the tagged tapbranch hash
45
+ */
46
+ export declare function hashTapBranch(child1: Buffer, child2: Buffer): Buffer;
47
+ /**
48
+ * Tweaks a privkey, using the tagged hash of its pubkey, and (optionally) a taptree root
49
+ * @param ecc Elliptic curve implementation
50
+ * @param pubkey public key, used to calculate the tweak
51
+ * @param privkey the privkey to tweak
52
+ * @param taptreeRoot the taptree root tagged hash
53
+ * @returns {Buffer} the tweaked privkey
54
+ */
55
+ export declare function tapTweakPrivkey(ecc: TinySecp256k1Interface, pubkey: Uint8Array, privkey: Uint8Array, taptreeRoot?: Uint8Array): Uint8Array;
56
+ export interface XOnlyPointAddTweakResult {
57
+ parity: 1 | 0;
58
+ xOnlyPubkey: Uint8Array;
59
+ }
60
+ /**
61
+ * Tweaks an internal pubkey, using the tagged hash of itself, and (optionally) a taptree root
62
+ * @param ecc Elliptic curve implementation
63
+ * @param pubkey the internal pubkey to tweak
64
+ * @param taptreeRoot the taptree root tagged hash
65
+ * @returns {TweakedPubkey} the tweaked pubkey
66
+ */
67
+ export declare function tapTweakPubkey(ecc: TinySecp256k1Interface, pubkey: Uint8Array, taptreeRoot?: Buffer): XOnlyPointAddTweakResult;
68
+ export interface Taptree {
69
+ root: Buffer;
70
+ paths: Buffer[][];
71
+ }
72
+ /**
73
+ * Gets the root hash and hash-paths of a taptree from the depth-first
74
+ * construction used in BIP-0371 PSBTs
75
+ * @param tree
76
+ * @returns {Taptree} the tree, represented by its root hash, and the paths to
77
+ * that root from each of the input scripts
78
+ */
79
+ export declare function getDepthFirstTaptree(tree: PsbtTapTree): Taptree;
80
+ /**
81
+ * Gets the root hash of a taptree using a weighted Huffman construction from a
82
+ * list of scripts and corresponding weights.
83
+ * @param scripts
84
+ * @param weights
85
+ * @returns {Taptree} the tree, represented by its root hash, and the paths to that root from each of the input scripts
86
+ */
87
+ export declare function getHuffmanTaptree(scripts: Buffer[], weights: Array<number | undefined>): Taptree;
88
+ export declare function getControlBlock(parity: 0 | 1, pubkey: Uint8Array, path: Buffer[], leafVersion?: number): Buffer;
89
+ export interface KeyPathWitness {
90
+ spendType: 'Key';
91
+ signature: Buffer;
92
+ annex?: Buffer;
93
+ }
94
+ export interface ScriptPathWitness {
95
+ spendType: 'Script';
96
+ scriptSig: Buffer[];
97
+ tapscript: Buffer;
98
+ controlBlock: Buffer;
99
+ annex?: Buffer;
100
+ }
101
+ export interface ControlBlock {
102
+ parity: number;
103
+ internalPubkey: Buffer;
104
+ leafVersion: number;
105
+ path: Buffer[];
106
+ }
107
+ /**
108
+ * Parses a taproot witness stack and extracts key data elements.
109
+ * @param witnessStack
110
+ * @returns {ScriptPathWitness|KeyPathWitness} an object representing the
111
+ * parsed witness for a script path or key path spend.
112
+ * @throws {Error} if the witness stack does not conform to the BIP 341 script validation rules
113
+ */
114
+ export declare function parseTaprootWitness(witnessStack: Buffer[]): ScriptPathWitness | KeyPathWitness;
115
+ /**
116
+ * Parses a taproot control block.
117
+ * @param ecc Elliptic curve implementation
118
+ * @param controlBlock the control block to parse
119
+ * @returns {ControlBlock} the parsed control block
120
+ * @throws {Error} if the witness stack does not conform to the BIP 341 script validation rules
121
+ */
122
+ export declare function parseControlBlock(ecc: TinySecp256k1Interface, controlBlock: Buffer): ControlBlock;
123
+ /**
124
+ * Calculates the tapleaf hash from a control block and script.
125
+ * @param ecc Elliptic curve implementation
126
+ * @param controlBlock the control block, either raw or parsed
127
+ * @param tapscript the leaf script corresdponding to the control block
128
+ * @returns {Buffer} the tapleaf hash
129
+ */
130
+ export declare function getTapleafHash(ecc: TinySecp256k1Interface, controlBlock: Buffer | ControlBlock, tapscript: Buffer): Buffer;
131
+ /**
132
+ * Calculates the taptree root hash from a control block and script.
133
+ * @param ecc Elliptic curve implementation
134
+ * @param controlBlock the control block, either raw or parsed
135
+ * @param tapscript the leaf script corresdponding to the control block
136
+ * @param tapleafHash the leaf hash if already calculated
137
+ * @returns {Buffer} the taptree root hash
138
+ */
139
+ export declare function getTaptreeRoot(ecc: TinySecp256k1Interface, controlBlock: Buffer | ControlBlock, tapscript: Buffer, tapleafHash?: Buffer): Buffer;
140
+ export declare function getTweakedOutputKey(payment: bpayments.Payment): Buffer;
141
+ //# sourceMappingURL=taproot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taproot.d.ts","sourceRoot":"","sources":["../../src/taproot.ts"],"names":[],"mappings":"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"}