xpi-ts 0.2.13 → 0.2.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/dist/cjs/lib/bitcore/address.js +75 -74
  2. package/dist/cjs/lib/bitcore/block/block.js +124 -126
  3. package/dist/cjs/lib/bitcore/block/blockheader.js +142 -208
  4. package/dist/cjs/lib/bitcore/block/index.js +3 -1
  5. package/dist/cjs/lib/bitcore/block/merkleblock.js +301 -0
  6. package/dist/cjs/lib/bitcore/crypto/bn.js +18 -22
  7. package/dist/cjs/lib/bitcore/crypto/ecdsa.js +50 -49
  8. package/dist/cjs/lib/bitcore/crypto/hash.js +25 -22
  9. package/dist/cjs/lib/bitcore/crypto/musig2.js +86 -92
  10. package/dist/cjs/lib/bitcore/crypto/point.js +42 -35
  11. package/dist/cjs/lib/bitcore/crypto/random.js +3 -2
  12. package/dist/cjs/lib/bitcore/crypto/schnorr.js +46 -55
  13. package/dist/cjs/lib/bitcore/crypto/signature.js +67 -55
  14. package/dist/cjs/lib/bitcore/crypto/sigtype.js +1 -1
  15. package/dist/cjs/lib/bitcore/encoding/base58.js +5 -4
  16. package/dist/cjs/lib/bitcore/encoding/base58check.js +14 -57
  17. package/dist/cjs/lib/bitcore/encoding/bufferreader.js +17 -17
  18. package/dist/cjs/lib/bitcore/encoding/bufferwriter.js +22 -26
  19. package/dist/cjs/lib/bitcore/encoding/varint.js +12 -11
  20. package/dist/cjs/lib/bitcore/errors.js +1 -0
  21. package/dist/cjs/lib/bitcore/hdprivatekey.js +74 -66
  22. package/dist/cjs/lib/bitcore/hdpublickey.js +96 -116
  23. package/dist/cjs/lib/bitcore/index.js +165 -172
  24. package/dist/cjs/lib/bitcore/message.js +36 -35
  25. package/dist/cjs/lib/bitcore/mnemonic/mnemonic.js +4 -3
  26. package/dist/cjs/lib/bitcore/mnemonic/pbkdf2.js +6 -5
  27. package/dist/cjs/lib/bitcore/mnemonic/words/french.js +2053 -0
  28. package/dist/cjs/lib/bitcore/mnemonic/words/index.js +2 -0
  29. package/dist/cjs/lib/bitcore/musig2/session.js +26 -25
  30. package/dist/cjs/lib/bitcore/musig2/signer.js +17 -16
  31. package/dist/cjs/lib/bitcore/networks.js +4 -3
  32. package/dist/cjs/lib/bitcore/opcode.js +11 -7
  33. package/dist/cjs/lib/bitcore/privatekey.js +42 -42
  34. package/dist/cjs/lib/bitcore/publickey.js +61 -57
  35. package/dist/cjs/lib/bitcore/script/interpreter/condition-stack.js +41 -0
  36. package/dist/cjs/lib/bitcore/script/interpreter/index.js +25 -0
  37. package/dist/cjs/lib/bitcore/script/interpreter/interpreter.js +1362 -0
  38. package/dist/cjs/lib/bitcore/script/interpreter/script-num.js +200 -0
  39. package/dist/cjs/lib/bitcore/script/interpreter/types.js +96 -0
  40. package/dist/cjs/lib/bitcore/{taproot.js → script/taproot.js} +107 -95
  41. package/dist/cjs/lib/bitcore/script.js +163 -104
  42. package/dist/cjs/lib/bitcore/taproot/musig2.js +51 -42
  43. package/dist/cjs/lib/bitcore/transaction/index.js +21 -21
  44. package/dist/cjs/lib/bitcore/transaction/input/multisig.js +10 -0
  45. package/dist/cjs/lib/bitcore/transaction/input/multisigscripthash.js +10 -0
  46. package/dist/cjs/lib/bitcore/transaction/input/publickey.js +10 -0
  47. package/dist/cjs/lib/bitcore/transaction/input/publickeyhash.js +10 -0
  48. package/dist/cjs/lib/bitcore/transaction/input/taproot.js +20 -0
  49. package/dist/cjs/lib/bitcore/transaction/input.js +145 -166
  50. package/dist/cjs/lib/bitcore/transaction/outpoint.js +89 -0
  51. package/dist/cjs/lib/bitcore/transaction/output.js +13 -8
  52. package/dist/cjs/lib/bitcore/transaction/sighash.js +96 -96
  53. package/dist/cjs/lib/bitcore/transaction/signature.js +39 -40
  54. package/dist/cjs/lib/bitcore/transaction/transaction.js +130 -118
  55. package/dist/cjs/lib/bitcore/transaction/unspentoutput.js +27 -23
  56. package/dist/cjs/lib/bitcore/util/bits.js +33 -0
  57. package/dist/cjs/lib/bitcore/util/buffer.js +29 -18
  58. package/dist/cjs/lib/bitcore/util/js.js +0 -3
  59. package/dist/cjs/lib/bitcore/util/merkle.js +53 -0
  60. package/dist/cjs/lib/bitcore/util/preconditions.js +8 -7
  61. package/dist/cjs/lib/bitcore/xaddress.js +27 -23
  62. package/dist/cjs/lib/{bitcore/taproot/nft.js → nft.js} +98 -29
  63. package/dist/cjs/lib/rank/index.js +28 -27
  64. package/dist/cjs/lib/rank/script.js +2 -1
  65. package/dist/cjs/lib/rank/transaction.js +2 -1
  66. package/dist/cjs/utils/string.js +6 -5
  67. package/dist/esm/lib/bitcore/address.js +42 -41
  68. package/dist/esm/lib/bitcore/block/block.js +126 -128
  69. package/dist/esm/lib/bitcore/block/blockheader.js +141 -207
  70. package/dist/esm/lib/bitcore/block/index.js +1 -0
  71. package/dist/esm/lib/bitcore/block/merkleblock.js +295 -0
  72. package/dist/esm/lib/bitcore/crypto/bn.js +18 -22
  73. package/dist/esm/lib/bitcore/crypto/ecdsa.js +25 -24
  74. package/dist/esm/lib/bitcore/crypto/hash.js +25 -22
  75. package/dist/esm/lib/bitcore/crypto/musig2.js +60 -66
  76. package/dist/esm/lib/bitcore/crypto/point.js +22 -15
  77. package/dist/esm/lib/bitcore/crypto/random.js +3 -2
  78. package/dist/esm/lib/bitcore/crypto/schnorr.js +35 -44
  79. package/dist/esm/lib/bitcore/crypto/signature.js +61 -49
  80. package/dist/esm/lib/bitcore/crypto/sigtype.js +1 -1
  81. package/dist/esm/lib/bitcore/encoding/base58.js +5 -4
  82. package/dist/esm/lib/bitcore/encoding/base58check.js +11 -57
  83. package/dist/esm/lib/bitcore/encoding/bufferreader.js +7 -7
  84. package/dist/esm/lib/bitcore/encoding/bufferwriter.js +18 -21
  85. package/dist/esm/lib/bitcore/encoding/varint.js +7 -6
  86. package/dist/esm/lib/bitcore/errors.js +1 -0
  87. package/dist/esm/lib/bitcore/hdprivatekey.js +47 -39
  88. package/dist/esm/lib/bitcore/hdpublickey.js +77 -97
  89. package/dist/esm/lib/bitcore/index.js +42 -45
  90. package/dist/esm/lib/bitcore/message.js +16 -15
  91. package/dist/esm/lib/bitcore/mnemonic/mnemonic.js +4 -3
  92. package/dist/esm/lib/bitcore/mnemonic/pbkdf2.js +5 -4
  93. package/dist/esm/lib/bitcore/mnemonic/words/french.js +2050 -0
  94. package/dist/esm/lib/bitcore/mnemonic/words/index.js +2 -0
  95. package/dist/esm/lib/bitcore/musig2/session.js +17 -16
  96. package/dist/esm/lib/bitcore/musig2/signer.js +19 -18
  97. package/dist/esm/lib/bitcore/networks.js +4 -3
  98. package/dist/esm/lib/bitcore/opcode.js +9 -5
  99. package/dist/esm/lib/bitcore/privatekey.js +25 -25
  100. package/dist/esm/lib/bitcore/publickey.js +46 -42
  101. package/dist/esm/lib/bitcore/script/interpreter/condition-stack.js +37 -0
  102. package/dist/esm/lib/bitcore/script/interpreter/index.js +4 -0
  103. package/dist/esm/lib/bitcore/script/interpreter/interpreter.js +1356 -0
  104. package/dist/esm/lib/bitcore/script/interpreter/script-num.js +195 -0
  105. package/dist/esm/lib/bitcore/script/interpreter/types.js +93 -0
  106. package/dist/esm/lib/bitcore/{taproot.js → script/taproot.js} +92 -81
  107. package/dist/esm/lib/bitcore/script.js +163 -102
  108. package/dist/esm/lib/bitcore/taproot/musig2.js +36 -27
  109. package/dist/esm/lib/bitcore/transaction/index.js +6 -6
  110. package/dist/esm/lib/bitcore/transaction/input/multisig.js +6 -0
  111. package/dist/esm/lib/bitcore/transaction/input/multisigscripthash.js +6 -0
  112. package/dist/esm/lib/bitcore/transaction/input/publickey.js +6 -0
  113. package/dist/esm/lib/bitcore/transaction/input/publickeyhash.js +6 -0
  114. package/dist/esm/lib/bitcore/transaction/input/taproot.js +16 -0
  115. package/dist/esm/lib/bitcore/transaction/input.js +55 -76
  116. package/dist/esm/lib/bitcore/transaction/outpoint.js +85 -0
  117. package/dist/esm/lib/bitcore/transaction/output.js +13 -8
  118. package/dist/esm/lib/bitcore/transaction/sighash.js +22 -22
  119. package/dist/esm/lib/bitcore/transaction/signature.js +16 -17
  120. package/dist/esm/lib/bitcore/transaction/transaction.js +58 -46
  121. package/dist/esm/lib/bitcore/transaction/unspentoutput.js +15 -11
  122. package/dist/esm/lib/bitcore/util/bits.js +27 -0
  123. package/dist/esm/lib/bitcore/util/buffer.js +20 -9
  124. package/dist/esm/lib/bitcore/util/js.js +0 -3
  125. package/dist/esm/lib/bitcore/util/merkle.js +47 -0
  126. package/dist/esm/lib/bitcore/util/preconditions.js +3 -2
  127. package/dist/esm/lib/bitcore/xaddress.js +16 -12
  128. package/dist/esm/lib/{bitcore/taproot/nft.js → nft.js} +97 -28
  129. package/dist/esm/lib/rank/index.js +15 -14
  130. package/dist/esm/lib/rank/script.js +1 -0
  131. package/dist/esm/lib/rank/transaction.js +1 -0
  132. package/dist/esm/utils/string.js +1 -0
  133. package/dist/types/lib/bitcore/address.d.ts +4 -3
  134. package/dist/types/lib/bitcore/address.d.ts.map +1 -1
  135. package/dist/types/lib/bitcore/block/block.d.ts +11 -19
  136. package/dist/types/lib/bitcore/block/block.d.ts.map +1 -1
  137. package/dist/types/lib/bitcore/block/blockheader.d.ts +30 -32
  138. package/dist/types/lib/bitcore/block/blockheader.d.ts.map +1 -1
  139. package/dist/types/lib/bitcore/block/index.d.ts +2 -0
  140. package/dist/types/lib/bitcore/block/index.d.ts.map +1 -1
  141. package/dist/types/lib/bitcore/block/merkleblock.d.ts +53 -0
  142. package/dist/types/lib/bitcore/block/merkleblock.d.ts.map +1 -0
  143. package/dist/types/lib/bitcore/crypto/bn.d.ts +2 -2
  144. package/dist/types/lib/bitcore/crypto/bn.d.ts.map +1 -1
  145. package/dist/types/lib/bitcore/crypto/ecdsa.d.ts +5 -4
  146. package/dist/types/lib/bitcore/crypto/ecdsa.d.ts.map +1 -1
  147. package/dist/types/lib/bitcore/crypto/hash.d.ts +3 -1
  148. package/dist/types/lib/bitcore/crypto/hash.d.ts.map +1 -1
  149. package/dist/types/lib/bitcore/crypto/musig2.d.ts +22 -30
  150. package/dist/types/lib/bitcore/crypto/musig2.d.ts.map +1 -1
  151. package/dist/types/lib/bitcore/crypto/point.d.ts +8 -3
  152. package/dist/types/lib/bitcore/crypto/point.d.ts.map +1 -1
  153. package/dist/types/lib/bitcore/crypto/random.d.ts +1 -0
  154. package/dist/types/lib/bitcore/crypto/random.d.ts.map +1 -1
  155. package/dist/types/lib/bitcore/crypto/schnorr.d.ts +5 -4
  156. package/dist/types/lib/bitcore/crypto/schnorr.d.ts.map +1 -1
  157. package/dist/types/lib/bitcore/crypto/signature.d.ts +4 -1
  158. package/dist/types/lib/bitcore/crypto/signature.d.ts.map +1 -1
  159. package/dist/types/lib/bitcore/crypto/sigtype.d.ts +1 -0
  160. package/dist/types/lib/bitcore/crypto/sigtype.d.ts.map +1 -1
  161. package/dist/types/lib/bitcore/encoding/base58.d.ts +1 -0
  162. package/dist/types/lib/bitcore/encoding/base58.d.ts.map +1 -1
  163. package/dist/types/lib/bitcore/encoding/base58check.d.ts +1 -2
  164. package/dist/types/lib/bitcore/encoding/base58check.d.ts.map +1 -1
  165. package/dist/types/lib/bitcore/encoding/bufferreader.d.ts +2 -1
  166. package/dist/types/lib/bitcore/encoding/bufferreader.d.ts.map +1 -1
  167. package/dist/types/lib/bitcore/encoding/bufferwriter.d.ts +2 -2
  168. package/dist/types/lib/bitcore/encoding/bufferwriter.d.ts.map +1 -1
  169. package/dist/types/lib/bitcore/encoding/varint.d.ts +3 -2
  170. package/dist/types/lib/bitcore/encoding/varint.d.ts.map +1 -1
  171. package/dist/types/lib/bitcore/errors.d.ts +3 -0
  172. package/dist/types/lib/bitcore/errors.d.ts.map +1 -1
  173. package/dist/types/lib/bitcore/hdprivatekey.d.ts +5 -4
  174. package/dist/types/lib/bitcore/hdprivatekey.d.ts.map +1 -1
  175. package/dist/types/lib/bitcore/hdpublickey.d.ts +4 -3
  176. package/dist/types/lib/bitcore/hdpublickey.d.ts.map +1 -1
  177. package/dist/types/lib/bitcore/index.d.ts +55 -60
  178. package/dist/types/lib/bitcore/index.d.ts.map +1 -1
  179. package/dist/types/lib/bitcore/message.d.ts +7 -4
  180. package/dist/types/lib/bitcore/message.d.ts.map +1 -1
  181. package/dist/types/lib/bitcore/mnemonic/mnemonic.d.ts +2 -0
  182. package/dist/types/lib/bitcore/mnemonic/mnemonic.d.ts.map +1 -1
  183. package/dist/types/lib/bitcore/mnemonic/pbkdf2.d.ts +1 -0
  184. package/dist/types/lib/bitcore/mnemonic/pbkdf2.d.ts.map +1 -1
  185. package/dist/types/lib/bitcore/mnemonic/words/french.d.ts +2 -0
  186. package/dist/types/lib/bitcore/mnemonic/words/french.d.ts.map +1 -0
  187. package/dist/types/lib/bitcore/mnemonic/words/index.d.ts +1 -0
  188. package/dist/types/lib/bitcore/mnemonic/words/index.d.ts.map +1 -1
  189. package/dist/types/lib/bitcore/musig2/session.d.ts +8 -7
  190. package/dist/types/lib/bitcore/musig2/session.d.ts.map +1 -1
  191. package/dist/types/lib/bitcore/musig2/signer.d.ts +10 -9
  192. package/dist/types/lib/bitcore/musig2/signer.d.ts.map +1 -1
  193. package/dist/types/lib/bitcore/networks.d.ts +1 -0
  194. package/dist/types/lib/bitcore/networks.d.ts.map +1 -1
  195. package/dist/types/lib/bitcore/opcode.d.ts +5 -0
  196. package/dist/types/lib/bitcore/opcode.d.ts.map +1 -1
  197. package/dist/types/lib/bitcore/privatekey.d.ts +5 -4
  198. package/dist/types/lib/bitcore/privatekey.d.ts.map +1 -1
  199. package/dist/types/lib/bitcore/publickey.d.ts +13 -6
  200. package/dist/types/lib/bitcore/publickey.d.ts.map +1 -1
  201. package/dist/types/lib/bitcore/{chunk.d.ts → script/chunk.d.ts} +1 -0
  202. package/dist/types/lib/bitcore/script/chunk.d.ts.map +1 -0
  203. package/dist/types/lib/bitcore/script/interpreter/condition-stack.d.ts +11 -0
  204. package/dist/types/lib/bitcore/script/interpreter/condition-stack.d.ts.map +1 -0
  205. package/dist/types/lib/bitcore/script/interpreter/index.d.ts +5 -0
  206. package/dist/types/lib/bitcore/script/interpreter/index.d.ts.map +1 -0
  207. package/dist/types/lib/bitcore/script/interpreter/interpreter.d.ts +21 -0
  208. package/dist/types/lib/bitcore/script/interpreter/interpreter.d.ts.map +1 -0
  209. package/dist/types/lib/bitcore/script/interpreter/script-num.d.ts +35 -0
  210. package/dist/types/lib/bitcore/script/interpreter/script-num.d.ts.map +1 -0
  211. package/dist/types/lib/bitcore/script/interpreter/types.d.ts +101 -0
  212. package/dist/types/lib/bitcore/script/interpreter/types.d.ts.map +1 -0
  213. package/dist/types/lib/bitcore/{taproot.d.ts → script/taproot.d.ts} +20 -7
  214. package/dist/types/lib/bitcore/script/taproot.d.ts.map +1 -0
  215. package/dist/types/lib/bitcore/script.d.ts +12 -11
  216. package/dist/types/lib/bitcore/script.d.ts.map +1 -1
  217. package/dist/types/lib/bitcore/taproot/musig2.d.ts +17 -16
  218. package/dist/types/lib/bitcore/taproot/musig2.d.ts.map +1 -1
  219. package/dist/types/lib/bitcore/transaction/index.d.ts +11 -11
  220. package/dist/types/lib/bitcore/transaction/index.d.ts.map +1 -1
  221. package/dist/types/lib/bitcore/transaction/input/multisig.d.ts +5 -0
  222. package/dist/types/lib/bitcore/transaction/input/multisig.d.ts.map +1 -0
  223. package/dist/types/lib/bitcore/transaction/input/multisigscripthash.d.ts +5 -0
  224. package/dist/types/lib/bitcore/transaction/input/multisigscripthash.d.ts.map +1 -0
  225. package/dist/types/lib/bitcore/transaction/input/publickey.d.ts +5 -0
  226. package/dist/types/lib/bitcore/transaction/input/publickey.d.ts.map +1 -0
  227. package/dist/types/lib/bitcore/transaction/input/publickeyhash.d.ts +6 -0
  228. package/dist/types/lib/bitcore/transaction/input/publickeyhash.d.ts.map +1 -0
  229. package/dist/types/lib/bitcore/transaction/input/taproot.d.ts +18 -0
  230. package/dist/types/lib/bitcore/transaction/input/taproot.d.ts.map +1 -0
  231. package/dist/types/lib/bitcore/transaction/input.d.ts +27 -35
  232. package/dist/types/lib/bitcore/transaction/input.d.ts.map +1 -1
  233. package/dist/types/lib/bitcore/transaction/outpoint.d.ts +32 -0
  234. package/dist/types/lib/bitcore/transaction/outpoint.d.ts.map +1 -0
  235. package/dist/types/lib/bitcore/transaction/output.d.ts +3 -1
  236. package/dist/types/lib/bitcore/transaction/output.d.ts.map +1 -1
  237. package/dist/types/lib/bitcore/transaction/sighash.d.ts +8 -7
  238. package/dist/types/lib/bitcore/transaction/sighash.d.ts.map +1 -1
  239. package/dist/types/lib/bitcore/transaction/signature.d.ts +3 -2
  240. package/dist/types/lib/bitcore/transaction/signature.d.ts.map +1 -1
  241. package/dist/types/lib/bitcore/transaction/transaction.d.ts +18 -15
  242. package/dist/types/lib/bitcore/transaction/transaction.d.ts.map +1 -1
  243. package/dist/types/lib/bitcore/transaction/unspentoutput.d.ts +9 -7
  244. package/dist/types/lib/bitcore/transaction/unspentoutput.d.ts.map +1 -1
  245. package/dist/types/lib/bitcore/unit.d.ts.map +1 -1
  246. package/dist/types/lib/bitcore/util/base32.d.ts.map +1 -1
  247. package/dist/types/lib/bitcore/util/bits.d.ts +5 -0
  248. package/dist/types/lib/bitcore/util/bits.d.ts.map +1 -0
  249. package/dist/types/lib/bitcore/util/buffer.d.ts +10 -2
  250. package/dist/types/lib/bitcore/util/buffer.d.ts.map +1 -1
  251. package/dist/types/lib/bitcore/util/js.d.ts +0 -1
  252. package/dist/types/lib/bitcore/util/js.d.ts.map +1 -1
  253. package/dist/types/lib/bitcore/util/merkle.d.ts +6 -0
  254. package/dist/types/lib/bitcore/util/merkle.d.ts.map +1 -0
  255. package/dist/types/lib/bitcore/util/preconditions.d.ts.map +1 -1
  256. package/dist/types/lib/bitcore/xaddress.d.ts +1 -0
  257. package/dist/types/lib/bitcore/xaddress.d.ts.map +1 -1
  258. package/dist/types/lib/{bitcore/taproot/nft.d.ts → nft.d.ts} +26 -12
  259. package/dist/types/lib/nft.d.ts.map +1 -0
  260. package/dist/types/lib/rank/index.d.ts +1 -0
  261. package/dist/types/lib/rank/index.d.ts.map +1 -1
  262. package/dist/types/lib/rank/script.d.ts +1 -0
  263. package/dist/types/lib/rank/script.d.ts.map +1 -1
  264. package/dist/types/lib/rank/transaction.d.ts +1 -0
  265. package/dist/types/lib/rank/transaction.d.ts.map +1 -1
  266. package/dist/types/utils/string.d.ts +1 -0
  267. package/dist/types/utils/string.d.ts.map +1 -1
  268. package/package.json +3 -2
  269. package/dist/cjs/lib/bitcore/script/interpreter.js +0 -1757
  270. package/dist/esm/lib/bitcore/script/interpreter.js +0 -1753
  271. package/dist/types/lib/bitcore/chunk.d.ts.map +0 -1
  272. package/dist/types/lib/bitcore/script/interpreter.d.ts +0 -101
  273. package/dist/types/lib/bitcore/script/interpreter.d.ts.map +0 -1
  274. package/dist/types/lib/bitcore/taproot/nft.d.ts.map +0 -1
  275. package/dist/types/lib/bitcore/taproot.d.ts.map +0 -1
  276. /package/dist/cjs/lib/bitcore/{chunk.js → script/chunk.js} +0 -0
  277. /package/dist/esm/lib/bitcore/{chunk.js → script/chunk.js} +0 -0
@@ -0,0 +1,1356 @@
1
+ import { BN, Schnorr, ECDSA, Signature, isSchnorrSignature } from '../../crypto';
2
+ import { PublicKey } from '../../publickey';
3
+ import { sighash as computeSighash } from '../../transaction/sighash';
4
+ import { BufferUtil } from '../../util/buffer';
5
+ import { Opcode } from '../../opcode';
6
+ import { Hash } from '../../crypto/hash';
7
+ import { Script } from '../../script';
8
+ import { ConditionStack } from './condition-stack';
9
+ import { ScriptNum } from './script-num';
10
+ import { MAX_SCRIPT_ELEMENT_SIZE, MAX_OPS_PER_SCRIPT, MAX_PUBKEYS_PER_MULTISIG, MAX_SCRIPT_SIZE, MAX_STACK_SIZE, MAX_NUM2BIN_SIZE, ScriptError, ScriptFlags, } from './types';
11
+ import { TAPROOT_SCRIPTTYPE, TAPROOT_INTRO_SIZE, TAPROOT_SIZE_WITHOUT_STATE, TAPROOT_SIZE_WITH_STATE, TAPROOT_ANNEX_TAG, TAPROOT_LEAF_MASK, TAPROOT_LEAF_TAPSCRIPT, TAPROOT_CONTROL_BASE_SIZE, TAPROOT_CONTROL_NODE_SIZE, TAPROOT_CONTROL_MAX_SIZE, verifyTaprootCommitment, } from '../taproot';
12
+ function stacktop(stack, offset) {
13
+ return stack[stack.length + offset];
14
+ }
15
+ function stackset(stack, offset, value) {
16
+ stack[stack.length + offset] = value;
17
+ }
18
+ function popstack(stack) {
19
+ if (stack.length === 0) {
20
+ throw new Error('popstack: stack empty');
21
+ }
22
+ stack.pop();
23
+ }
24
+ function stackswap(stack, offsetA, offsetB) {
25
+ const idxA = stack.length + offsetA;
26
+ const idxB = stack.length + offsetB;
27
+ const tmp = stack[idxA];
28
+ stack[idxA] = stack[idxB];
29
+ stack[idxB] = tmp;
30
+ }
31
+ const EMPTY_BUFFER = BufferUtil.alloc(0);
32
+ const FALSE_BUFFER = BufferUtil.alloc(0);
33
+ const TRUE_BUFFER = BufferUtil.from([0x01]);
34
+ function castToBool(buf) {
35
+ for (let i = 0; i < buf.length; i++) {
36
+ if (buf[i] !== 0) {
37
+ if (i === buf.length - 1 && buf[i] === 0x80) {
38
+ return false;
39
+ }
40
+ return true;
41
+ }
42
+ }
43
+ return false;
44
+ }
45
+ const FIRST_UNDEFINED_OP_VALUE = Opcode.OP_RAWLEFTBITSHIFT + 1;
46
+ function isOpcodeDisabled(opcode) {
47
+ switch (opcode) {
48
+ case Opcode.OP_RESERVED:
49
+ case Opcode.OP_VERIF:
50
+ case Opcode.OP_VERNOTIF:
51
+ case Opcode.OP_IFDUP:
52
+ case Opcode.OP_INVERT:
53
+ case Opcode.OP_RESERVED1:
54
+ case Opcode.OP_RESERVED2:
55
+ case Opcode.OP_2MUL:
56
+ case Opcode.OP_2DIV:
57
+ case Opcode.OP_MUL:
58
+ case Opcode.OP_NUMEQUAL:
59
+ case Opcode.OP_NUMEQUALVERIFY:
60
+ case Opcode.OP_NUMNOTEQUAL:
61
+ case Opcode.OP_SHA1:
62
+ return true;
63
+ default:
64
+ if (opcode >= FIRST_UNDEFINED_OP_VALUE) {
65
+ return true;
66
+ }
67
+ return false;
68
+ }
69
+ }
70
+ function checkMinimalPush(data, opcode) {
71
+ if (data.length === 0) {
72
+ return opcode === Opcode.OP_0;
73
+ }
74
+ if (data.length === 1) {
75
+ if (data[0] >= 1 && data[0] <= 16) {
76
+ return opcode === Opcode.OP_1 + (data[0] - 1);
77
+ }
78
+ if (data[0] === 0x81) {
79
+ return opcode === Opcode.OP_1NEGATE;
80
+ }
81
+ }
82
+ if (data.length <= 75) {
83
+ return opcode === data.length;
84
+ }
85
+ if (data.length <= 255) {
86
+ return opcode === Opcode.OP_PUSHDATA1;
87
+ }
88
+ if (data.length <= 65535) {
89
+ return opcode === Opcode.OP_PUSHDATA2;
90
+ }
91
+ return true;
92
+ }
93
+ function readInstruction(script, offset) {
94
+ if (offset >= script.length) {
95
+ return null;
96
+ }
97
+ const opcode = script[offset];
98
+ let data = EMPTY_BUFFER;
99
+ let next = offset + 1;
100
+ if (opcode >= 0 && opcode < Opcode.OP_PUSHDATA1) {
101
+ const len = opcode;
102
+ if (next + len > script.length) {
103
+ return null;
104
+ }
105
+ data = script.slice(next, next + len);
106
+ next += len;
107
+ }
108
+ else if (opcode === Opcode.OP_PUSHDATA1) {
109
+ if (next >= script.length) {
110
+ return null;
111
+ }
112
+ const len = script[next];
113
+ next++;
114
+ if (next + len > script.length) {
115
+ return null;
116
+ }
117
+ data = script.slice(next, next + len);
118
+ next += len;
119
+ }
120
+ else if (opcode === Opcode.OP_PUSHDATA2) {
121
+ if (next + 2 > script.length) {
122
+ return null;
123
+ }
124
+ const len = script[next] | (script[next + 1] << 8);
125
+ next += 2;
126
+ if (next + len > script.length) {
127
+ return null;
128
+ }
129
+ data = script.slice(next, next + len);
130
+ next += len;
131
+ }
132
+ else if (opcode === Opcode.OP_PUSHDATA4) {
133
+ if (next + 4 > script.length) {
134
+ return null;
135
+ }
136
+ const len = script[next] |
137
+ (script[next + 1] << 8) |
138
+ (script[next + 2] << 16) |
139
+ ((script[next + 3] << 24) >>> 0);
140
+ next += 4;
141
+ if (next + len > script.length) {
142
+ return null;
143
+ }
144
+ data = script.slice(next, next + len);
145
+ next += len;
146
+ }
147
+ return { opcode, data, nextOffset: next };
148
+ }
149
+ function success() {
150
+ return { success: true, error: ScriptError.OK };
151
+ }
152
+ function failure(error) {
153
+ return { success: false, error };
154
+ }
155
+ export function evalScript(stack, scriptBuf, flags, checker, metrics, execdata) {
156
+ if (scriptBuf.length > MAX_SCRIPT_SIZE) {
157
+ return failure(ScriptError.SCRIPT_SIZE);
158
+ }
159
+ const altstack = [];
160
+ const vfExec = new ConditionStack();
161
+ let nOpCount = 0;
162
+ let opcodePos = 0;
163
+ let offset = 0;
164
+ let codeHashBegin = 0;
165
+ try {
166
+ while (offset < scriptBuf.length) {
167
+ const fExec = vfExec.allTrue();
168
+ const instr = readInstruction(scriptBuf, offset);
169
+ if (!instr) {
170
+ return failure(ScriptError.BAD_OPCODE);
171
+ }
172
+ const { opcode, data: pushData } = instr;
173
+ offset = instr.nextOffset;
174
+ if (pushData.length > MAX_SCRIPT_ELEMENT_SIZE) {
175
+ return failure(ScriptError.PUSH_SIZE);
176
+ }
177
+ if (opcode > Opcode.OP_16 && ++nOpCount > MAX_OPS_PER_SCRIPT) {
178
+ return failure(ScriptError.OP_COUNT);
179
+ }
180
+ if (isOpcodeDisabled(opcode)) {
181
+ return failure(ScriptError.DISABLED_OPCODE);
182
+ }
183
+ if (opcode === Opcode.OP_SCRIPTTYPE) {
184
+ return failure(ScriptError.INVALID_OP_SCRIPTTYPE);
185
+ }
186
+ if (fExec && opcode >= 0 && opcode <= Opcode.OP_PUSHDATA4) {
187
+ if (!checkMinimalPush(pushData, opcode)) {
188
+ return failure(ScriptError.MINIMALDATA);
189
+ }
190
+ stack.push(pushData);
191
+ }
192
+ else if (fExec ||
193
+ (opcode >= Opcode.OP_IF && opcode <= Opcode.OP_ENDIF)) {
194
+ const result = executeOpcode(opcode, stack, altstack, vfExec, fExec, flags, checker, metrics, execdata, scriptBuf, codeHashBegin, offset, opcodePos, nOpCount);
195
+ if (!result.success) {
196
+ return result;
197
+ }
198
+ if (result.codeHashBegin !== undefined) {
199
+ codeHashBegin = result.codeHashBegin;
200
+ }
201
+ if (result.nOpCount !== undefined) {
202
+ nOpCount = result.nOpCount;
203
+ }
204
+ }
205
+ if (stack.length + altstack.length > MAX_STACK_SIZE) {
206
+ return failure(ScriptError.STACK_SIZE);
207
+ }
208
+ opcodePos++;
209
+ }
210
+ }
211
+ catch {
212
+ return failure(ScriptError.UNKNOWN);
213
+ }
214
+ if (!vfExec.isEmpty()) {
215
+ return failure(ScriptError.UNBALANCED_CONDITIONAL);
216
+ }
217
+ return success();
218
+ }
219
+ function opcodeSuccess(overrides) {
220
+ return { success: true, error: ScriptError.OK, ...overrides };
221
+ }
222
+ function opcodeFailure(error) {
223
+ return { success: false, error };
224
+ }
225
+ function executeOpcode(opcode, stack, altstack, vfExec, fExec, flags, checker, metrics, execdata, scriptBuf, codeHashBegin, currentOffset, opcodePos, nOpCount) {
226
+ switch (opcode) {
227
+ case Opcode.OP_1NEGATE:
228
+ case Opcode.OP_1:
229
+ case Opcode.OP_2:
230
+ case Opcode.OP_3:
231
+ case Opcode.OP_4:
232
+ case Opcode.OP_5:
233
+ case Opcode.OP_6:
234
+ case Opcode.OP_7:
235
+ case Opcode.OP_8:
236
+ case Opcode.OP_9:
237
+ case Opcode.OP_10:
238
+ case Opcode.OP_11:
239
+ case Opcode.OP_12:
240
+ case Opcode.OP_13:
241
+ case Opcode.OP_14:
242
+ case Opcode.OP_15:
243
+ case Opcode.OP_16: {
244
+ const n = opcode - (Opcode.OP_1 - 1);
245
+ const bn = new ScriptNum(BigInt(n));
246
+ stack.push(bn.toBuffer());
247
+ return opcodeSuccess();
248
+ }
249
+ case Opcode.OP_NOP:
250
+ return opcodeSuccess();
251
+ case Opcode.OP_CHECKLOCKTIMEVERIFY: {
252
+ if (stack.length < 1) {
253
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
254
+ }
255
+ const nLockTime = ScriptNum.fromBuffer(stacktop(stack, -1), true, 5);
256
+ if (nLockTime.isNegative()) {
257
+ return opcodeFailure(ScriptError.NEGATIVE_LOCKTIME);
258
+ }
259
+ if (!checker.checkLockTime(nLockTime.value)) {
260
+ return opcodeFailure(ScriptError.UNSATISFIED_LOCKTIME);
261
+ }
262
+ return opcodeSuccess();
263
+ }
264
+ case Opcode.OP_CHECKSEQUENCEVERIFY: {
265
+ if (stack.length < 1) {
266
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
267
+ }
268
+ const nSequence = ScriptNum.fromBuffer(stacktop(stack, -1), true, 5);
269
+ if (nSequence.isNegative()) {
270
+ return opcodeFailure(ScriptError.NEGATIVE_LOCKTIME);
271
+ }
272
+ const SEQUENCE_LOCKTIME_DISABLE_FLAG = 1 << 31;
273
+ if ((Number(nSequence.value) & SEQUENCE_LOCKTIME_DISABLE_FLAG) !== 0) {
274
+ return opcodeSuccess();
275
+ }
276
+ if (!checker.checkSequence(nSequence.value)) {
277
+ return opcodeFailure(ScriptError.UNSATISFIED_LOCKTIME);
278
+ }
279
+ return opcodeSuccess();
280
+ }
281
+ case Opcode.OP_NOP1:
282
+ case Opcode.OP_NOP4:
283
+ case Opcode.OP_NOP5:
284
+ case Opcode.OP_NOP6:
285
+ case Opcode.OP_NOP7:
286
+ case Opcode.OP_NOP8:
287
+ case Opcode.OP_NOP9:
288
+ case Opcode.OP_NOP10: {
289
+ if (flags & ScriptFlags.VERIFY_DISCOURAGE_UPGRADABLE_NOPS) {
290
+ return opcodeFailure(ScriptError.DISCOURAGE_UPGRADABLE_NOPS);
291
+ }
292
+ return opcodeSuccess();
293
+ }
294
+ case Opcode.OP_IF:
295
+ case Opcode.OP_NOTIF: {
296
+ let fValue = false;
297
+ if (fExec) {
298
+ if (stack.length < 1) {
299
+ return opcodeFailure(ScriptError.UNBALANCED_CONDITIONAL);
300
+ }
301
+ const vch = stacktop(stack, -1);
302
+ if (flags & ScriptFlags.VERIFY_MINIMALIF) {
303
+ if (vch.length > 1) {
304
+ return opcodeFailure(ScriptError.MINIMALIF);
305
+ }
306
+ if (vch.length === 1 && vch[0] !== 1) {
307
+ return opcodeFailure(ScriptError.MINIMALIF);
308
+ }
309
+ }
310
+ fValue = castToBool(vch);
311
+ if (opcode === Opcode.OP_NOTIF) {
312
+ fValue = !fValue;
313
+ }
314
+ popstack(stack);
315
+ }
316
+ vfExec.pushBack(fValue);
317
+ return opcodeSuccess();
318
+ }
319
+ case Opcode.OP_ELSE: {
320
+ if (vfExec.isEmpty()) {
321
+ return opcodeFailure(ScriptError.UNBALANCED_CONDITIONAL);
322
+ }
323
+ vfExec.toggleTop();
324
+ return opcodeSuccess();
325
+ }
326
+ case Opcode.OP_ENDIF: {
327
+ if (vfExec.isEmpty()) {
328
+ return opcodeFailure(ScriptError.UNBALANCED_CONDITIONAL);
329
+ }
330
+ vfExec.popBack();
331
+ return opcodeSuccess();
332
+ }
333
+ case Opcode.OP_VERIFY: {
334
+ if (stack.length < 1) {
335
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
336
+ }
337
+ if (castToBool(stacktop(stack, -1))) {
338
+ popstack(stack);
339
+ }
340
+ else {
341
+ return opcodeFailure(ScriptError.VERIFY);
342
+ }
343
+ return opcodeSuccess();
344
+ }
345
+ case Opcode.OP_RETURN:
346
+ return opcodeFailure(ScriptError.OP_RETURN);
347
+ case Opcode.OP_TOALTSTACK: {
348
+ if (stack.length < 1) {
349
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
350
+ }
351
+ altstack.push(stacktop(stack, -1));
352
+ popstack(stack);
353
+ return opcodeSuccess();
354
+ }
355
+ case Opcode.OP_FROMALTSTACK: {
356
+ if (altstack.length < 1) {
357
+ return opcodeFailure(ScriptError.INVALID_ALTSTACK_OPERATION);
358
+ }
359
+ stack.push(altstack[altstack.length - 1]);
360
+ altstack.pop();
361
+ return opcodeSuccess();
362
+ }
363
+ case Opcode.OP_2DROP: {
364
+ if (stack.length < 2) {
365
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
366
+ }
367
+ popstack(stack);
368
+ popstack(stack);
369
+ return opcodeSuccess();
370
+ }
371
+ case Opcode.OP_2DUP: {
372
+ if (stack.length < 2) {
373
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
374
+ }
375
+ stack.push(stacktop(stack, -2));
376
+ stack.push(stacktop(stack, -2));
377
+ return opcodeSuccess();
378
+ }
379
+ case Opcode.OP_3DUP: {
380
+ if (stack.length < 3) {
381
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
382
+ }
383
+ stack.push(stacktop(stack, -3));
384
+ stack.push(stacktop(stack, -3));
385
+ stack.push(stacktop(stack, -3));
386
+ return opcodeSuccess();
387
+ }
388
+ case Opcode.OP_2OVER: {
389
+ if (stack.length < 4) {
390
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
391
+ }
392
+ stack.push(stacktop(stack, -4));
393
+ stack.push(stacktop(stack, -4));
394
+ return opcodeSuccess();
395
+ }
396
+ case Opcode.OP_2ROT: {
397
+ if (stack.length < 6) {
398
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
399
+ }
400
+ const v1 = stacktop(stack, -6);
401
+ const v2 = stacktop(stack, -5);
402
+ stack.splice(stack.length - 6, 2);
403
+ stack.push(v1, v2);
404
+ return opcodeSuccess();
405
+ }
406
+ case Opcode.OP_2SWAP: {
407
+ if (stack.length < 4) {
408
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
409
+ }
410
+ stackswap(stack, -4, -2);
411
+ stackswap(stack, -3, -1);
412
+ return opcodeSuccess();
413
+ }
414
+ case Opcode.OP_DEPTH: {
415
+ const bn = new ScriptNum(BigInt(stack.length));
416
+ stack.push(bn.toBuffer());
417
+ return opcodeSuccess();
418
+ }
419
+ case Opcode.OP_DROP: {
420
+ if (stack.length < 1) {
421
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
422
+ }
423
+ popstack(stack);
424
+ return opcodeSuccess();
425
+ }
426
+ case Opcode.OP_DUP: {
427
+ if (stack.length < 1) {
428
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
429
+ }
430
+ stack.push(stacktop(stack, -1));
431
+ return opcodeSuccess();
432
+ }
433
+ case Opcode.OP_NIP: {
434
+ if (stack.length < 2) {
435
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
436
+ }
437
+ stack.splice(stack.length - 2, 1);
438
+ return opcodeSuccess();
439
+ }
440
+ case Opcode.OP_OVER: {
441
+ if (stack.length < 2) {
442
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
443
+ }
444
+ stack.push(stacktop(stack, -2));
445
+ return opcodeSuccess();
446
+ }
447
+ case Opcode.OP_PICK:
448
+ case Opcode.OP_ROLL: {
449
+ if (stack.length < 2) {
450
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
451
+ }
452
+ const n = ScriptNum.fromBuffer(stacktop(stack, -1), true).toNumber();
453
+ popstack(stack);
454
+ if (n < 0 || n >= stack.length) {
455
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
456
+ }
457
+ const val = stacktop(stack, -n - 1);
458
+ if (opcode === Opcode.OP_ROLL) {
459
+ stack.splice(stack.length - n - 1, 1);
460
+ }
461
+ stack.push(val);
462
+ return opcodeSuccess();
463
+ }
464
+ case Opcode.OP_ROT: {
465
+ if (stack.length < 3) {
466
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
467
+ }
468
+ stackswap(stack, -3, -2);
469
+ stackswap(stack, -2, -1);
470
+ return opcodeSuccess();
471
+ }
472
+ case Opcode.OP_SWAP: {
473
+ if (stack.length < 2) {
474
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
475
+ }
476
+ stackswap(stack, -2, -1);
477
+ return opcodeSuccess();
478
+ }
479
+ case Opcode.OP_TUCK: {
480
+ if (stack.length < 2) {
481
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
482
+ }
483
+ const vch = stacktop(stack, -1);
484
+ stack.splice(stack.length - 2, 0, vch);
485
+ return opcodeSuccess();
486
+ }
487
+ case Opcode.OP_SIZE: {
488
+ if (stack.length < 1) {
489
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
490
+ }
491
+ const bn = new ScriptNum(BigInt(stacktop(stack, -1).length));
492
+ stack.push(bn.toBuffer());
493
+ return opcodeSuccess();
494
+ }
495
+ case Opcode.OP_AND:
496
+ case Opcode.OP_OR:
497
+ case Opcode.OP_XOR: {
498
+ if (stack.length < 2) {
499
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
500
+ }
501
+ const a = stacktop(stack, -2);
502
+ const b = stacktop(stack, -1);
503
+ const longer = a.length >= b.length ? a : b;
504
+ const shorter = a.length >= b.length ? b : a;
505
+ const result = longer;
506
+ if (opcode === Opcode.OP_AND) {
507
+ for (let i = 0; i < result.length; i++) {
508
+ result[i] = i < shorter.length ? result[i] & shorter[i] : 0;
509
+ }
510
+ }
511
+ else if (opcode === Opcode.OP_OR) {
512
+ for (let i = 0; i < shorter.length; i++) {
513
+ result[i] |= shorter[i];
514
+ }
515
+ }
516
+ else {
517
+ for (let i = 0; i < shorter.length; i++) {
518
+ result[i] ^= shorter[i];
519
+ }
520
+ }
521
+ const depthShorter = a.length >= b.length ? -1 : -2;
522
+ stack.splice(stack.length + depthShorter, 1);
523
+ stackset(stack, -1, result);
524
+ return opcodeSuccess();
525
+ }
526
+ case Opcode.OP_EQUAL:
527
+ case Opcode.OP_EQUALVERIFY: {
528
+ if (stack.length < 2) {
529
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
530
+ }
531
+ const a2 = stacktop(stack, -2);
532
+ const b2 = stacktop(stack, -1);
533
+ const fEqual = a2.equals(b2);
534
+ popstack(stack);
535
+ popstack(stack);
536
+ stack.push(fEqual ? TRUE_BUFFER : FALSE_BUFFER);
537
+ if (opcode === Opcode.OP_EQUALVERIFY) {
538
+ if (fEqual) {
539
+ popstack(stack);
540
+ }
541
+ else {
542
+ return opcodeFailure(ScriptError.EQUALVERIFY);
543
+ }
544
+ }
545
+ return opcodeSuccess();
546
+ }
547
+ case Opcode.OP_1ADD:
548
+ case Opcode.OP_1SUB:
549
+ case Opcode.OP_NEGATE:
550
+ case Opcode.OP_ABS:
551
+ case Opcode.OP_NOT:
552
+ case Opcode.OP_0NOTEQUAL: {
553
+ if (stack.length < 1) {
554
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
555
+ }
556
+ let bn = ScriptNum.fromBuffer(stacktop(stack, -1), true);
557
+ const ONE = new ScriptNum(1n);
558
+ switch (opcode) {
559
+ case Opcode.OP_1ADD:
560
+ bn = bn.add(ONE);
561
+ break;
562
+ case Opcode.OP_1SUB:
563
+ bn = bn.sub(ONE);
564
+ break;
565
+ case Opcode.OP_NEGATE:
566
+ bn = bn.negate();
567
+ break;
568
+ case Opcode.OP_ABS:
569
+ bn = bn.abs();
570
+ break;
571
+ case Opcode.OP_NOT:
572
+ bn = new ScriptNum(bn.isZero() ? 1n : 0n);
573
+ break;
574
+ case Opcode.OP_0NOTEQUAL:
575
+ bn = new ScriptNum(bn.isZero() ? 0n : 1n);
576
+ break;
577
+ }
578
+ popstack(stack);
579
+ stack.push(bn.toBuffer());
580
+ return opcodeSuccess();
581
+ }
582
+ case Opcode.OP_ADD:
583
+ case Opcode.OP_SUB:
584
+ case Opcode.OP_DIV:
585
+ case Opcode.OP_MOD:
586
+ case Opcode.OP_MULPOW2:
587
+ case Opcode.OP_BOOLAND:
588
+ case Opcode.OP_BOOLOR:
589
+ case Opcode.OP_LESSTHAN:
590
+ case Opcode.OP_GREATERTHAN:
591
+ case Opcode.OP_LESSTHANOREQUAL:
592
+ case Opcode.OP_GREATERTHANOREQUAL:
593
+ case Opcode.OP_MIN:
594
+ case Opcode.OP_MAX: {
595
+ if (stack.length < 2) {
596
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
597
+ }
598
+ const bn1 = ScriptNum.fromBuffer(stacktop(stack, -2), true);
599
+ const bn2 = ScriptNum.fromBuffer(stacktop(stack, -1), true);
600
+ let bnResult;
601
+ switch (opcode) {
602
+ case Opcode.OP_ADD:
603
+ bnResult = bn1.add(bn2);
604
+ break;
605
+ case Opcode.OP_SUB:
606
+ bnResult = bn1.sub(bn2);
607
+ break;
608
+ case Opcode.OP_DIV:
609
+ if (bn2.isZero()) {
610
+ return opcodeFailure(ScriptError.DIV_BY_ZERO);
611
+ }
612
+ bnResult = bn1.div(bn2);
613
+ break;
614
+ case Opcode.OP_MOD:
615
+ if (bn2.isZero()) {
616
+ return opcodeFailure(ScriptError.MOD_BY_ZERO);
617
+ }
618
+ bnResult = bn1.mod(bn2);
619
+ break;
620
+ case Opcode.OP_MULPOW2:
621
+ bnResult = bn1.mulpow2(bn2);
622
+ break;
623
+ case Opcode.OP_BOOLAND:
624
+ bnResult = new ScriptNum(!bn1.isZero() && !bn2.isZero() ? 1n : 0n);
625
+ break;
626
+ case Opcode.OP_BOOLOR:
627
+ bnResult = new ScriptNum(!bn1.isZero() || !bn2.isZero() ? 1n : 0n);
628
+ break;
629
+ case Opcode.OP_LESSTHAN:
630
+ bnResult = new ScriptNum(bn1.lt(bn2) ? 1n : 0n);
631
+ break;
632
+ case Opcode.OP_GREATERTHAN:
633
+ bnResult = new ScriptNum(bn1.gt(bn2) ? 1n : 0n);
634
+ break;
635
+ case Opcode.OP_LESSTHANOREQUAL:
636
+ bnResult = new ScriptNum(bn1.lte(bn2) ? 1n : 0n);
637
+ break;
638
+ case Opcode.OP_GREATERTHANOREQUAL:
639
+ bnResult = new ScriptNum(bn1.gte(bn2) ? 1n : 0n);
640
+ break;
641
+ case Opcode.OP_MIN:
642
+ bnResult = bn1.lt(bn2) ? bn1 : bn2;
643
+ break;
644
+ case Opcode.OP_MAX:
645
+ bnResult = bn1.gt(bn2) ? bn1 : bn2;
646
+ break;
647
+ default:
648
+ return opcodeFailure(ScriptError.BAD_OPCODE);
649
+ }
650
+ popstack(stack);
651
+ popstack(stack);
652
+ stack.push(bnResult.toBuffer());
653
+ return opcodeSuccess();
654
+ }
655
+ case Opcode.OP_WITHIN: {
656
+ if (stack.length < 3) {
657
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
658
+ }
659
+ const x = ScriptNum.fromBuffer(stacktop(stack, -3), true);
660
+ const min = ScriptNum.fromBuffer(stacktop(stack, -2), true);
661
+ const max = ScriptNum.fromBuffer(stacktop(stack, -1), true);
662
+ const fValue = min.lte(x) && x.lt(max);
663
+ popstack(stack);
664
+ popstack(stack);
665
+ popstack(stack);
666
+ stack.push(fValue ? TRUE_BUFFER : FALSE_BUFFER);
667
+ return opcodeSuccess();
668
+ }
669
+ case Opcode.OP_RIPEMD160:
670
+ case Opcode.OP_SHA256:
671
+ case Opcode.OP_HASH160:
672
+ case Opcode.OP_HASH256: {
673
+ if (stack.length < 1) {
674
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
675
+ }
676
+ const data = stacktop(stack, -1);
677
+ let hashResult;
678
+ switch (opcode) {
679
+ case Opcode.OP_RIPEMD160:
680
+ hashResult = Hash.ripemd160(data);
681
+ break;
682
+ case Opcode.OP_SHA256:
683
+ hashResult = Hash.sha256(data);
684
+ break;
685
+ case Opcode.OP_HASH160:
686
+ hashResult = Hash.sha256ripemd160(data);
687
+ break;
688
+ case Opcode.OP_HASH256:
689
+ hashResult = Hash.sha256sha256(data);
690
+ break;
691
+ default:
692
+ return opcodeFailure(ScriptError.BAD_OPCODE);
693
+ }
694
+ popstack(stack);
695
+ stack.push(hashResult);
696
+ return opcodeSuccess();
697
+ }
698
+ case Opcode.OP_CODESEPARATOR: {
699
+ execdata.codeseparatorPos = opcodePos;
700
+ return opcodeSuccess({ codeHashBegin: currentOffset });
701
+ }
702
+ case Opcode.OP_CHECKSIG:
703
+ case Opcode.OP_CHECKSIGVERIFY: {
704
+ if (stack.length < 2) {
705
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
706
+ }
707
+ const vchSig = stacktop(stack, -2);
708
+ const vchPubKey = stacktop(stack, -1);
709
+ let fSuccess = false;
710
+ if (vchSig.length > 0) {
711
+ const scriptCode = scriptBuf.slice(codeHashBegin);
712
+ fSuccess = checker.checkSignature(vchSig, vchPubKey, execdata, scriptCode, flags);
713
+ metrics.sigChecks += 1;
714
+ if (!fSuccess) {
715
+ return opcodeFailure(ScriptError.SIG_NULLFAIL);
716
+ }
717
+ }
718
+ popstack(stack);
719
+ popstack(stack);
720
+ stack.push(fSuccess ? TRUE_BUFFER : FALSE_BUFFER);
721
+ if (opcode === Opcode.OP_CHECKSIGVERIFY) {
722
+ if (fSuccess) {
723
+ popstack(stack);
724
+ }
725
+ else {
726
+ return opcodeFailure(ScriptError.CHECKSIGVERIFY);
727
+ }
728
+ }
729
+ return opcodeSuccess();
730
+ }
731
+ case Opcode.OP_CHECKDATASIG:
732
+ case Opcode.OP_CHECKDATASIGVERIFY: {
733
+ if (stack.length < 3) {
734
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
735
+ }
736
+ const cdsSig = stacktop(stack, -3);
737
+ const cdsMsg = stacktop(stack, -2);
738
+ const cdsPubKey = stacktop(stack, -1);
739
+ let cdSuccess = false;
740
+ if (cdsSig.length > 0) {
741
+ const msgHash = Hash.sha256(cdsMsg);
742
+ cdSuccess = checker.verifySignature(cdsSig, cdsPubKey, msgHash);
743
+ metrics.sigChecks += 1;
744
+ if (!cdSuccess) {
745
+ return opcodeFailure(ScriptError.SIG_NULLFAIL);
746
+ }
747
+ }
748
+ popstack(stack);
749
+ popstack(stack);
750
+ popstack(stack);
751
+ stack.push(cdSuccess ? TRUE_BUFFER : FALSE_BUFFER);
752
+ if (opcode === Opcode.OP_CHECKDATASIGVERIFY) {
753
+ if (cdSuccess) {
754
+ popstack(stack);
755
+ }
756
+ else {
757
+ return opcodeFailure(ScriptError.CHECKDATASIGVERIFY);
758
+ }
759
+ }
760
+ return opcodeSuccess();
761
+ }
762
+ case Opcode.OP_CHECKMULTISIG:
763
+ case Opcode.OP_CHECKMULTISIGVERIFY: {
764
+ return executeCheckmultisig(opcode, stack, flags, checker, metrics, execdata, scriptBuf, codeHashBegin, currentOffset, nOpCount);
765
+ }
766
+ case Opcode.OP_CAT: {
767
+ if (stack.length < 2) {
768
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
769
+ }
770
+ const catA = stacktop(stack, -2);
771
+ const catB = stacktop(stack, -1);
772
+ if (catA.length + catB.length > MAX_SCRIPT_ELEMENT_SIZE) {
773
+ return opcodeFailure(ScriptError.PUSH_SIZE);
774
+ }
775
+ const catResult = BufferUtil.concat([catA, catB]);
776
+ popstack(stack);
777
+ stackset(stack, -1, catResult);
778
+ return opcodeSuccess();
779
+ }
780
+ case Opcode.OP_SPLIT: {
781
+ if (stack.length < 2) {
782
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
783
+ }
784
+ const splitData = stacktop(stack, -2);
785
+ const pos = ScriptNum.fromBuffer(stacktop(stack, -1), true).toNumber();
786
+ if (pos < 0 || pos > splitData.length) {
787
+ return opcodeFailure(ScriptError.INVALID_SPLIT_RANGE);
788
+ }
789
+ const n1 = splitData.slice(0, pos);
790
+ const n2 = splitData.slice(pos);
791
+ stackset(stack, -2, n1);
792
+ stackset(stack, -1, n2);
793
+ return opcodeSuccess();
794
+ }
795
+ case Opcode.OP_REVERSEBYTES: {
796
+ if (stack.length < 1) {
797
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
798
+ }
799
+ const revData = stacktop(stack, -1);
800
+ revData.reverse();
801
+ stackset(stack, -1, revData);
802
+ return opcodeSuccess();
803
+ }
804
+ case Opcode.OP_NUM2BIN: {
805
+ if (stack.length < 2) {
806
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
807
+ }
808
+ const targetSize = ScriptNum.fromBuffer(stacktop(stack, -1), true).toNumber();
809
+ if (targetSize > MAX_SCRIPT_ELEMENT_SIZE) {
810
+ return opcodeFailure(ScriptError.PUSH_SIZE);
811
+ }
812
+ if (targetSize > MAX_NUM2BIN_SIZE) {
813
+ return opcodeFailure(ScriptError.INVALID_NUM2BIN_SIZE);
814
+ }
815
+ popstack(stack);
816
+ let rawnum = stacktop(stack, -1);
817
+ rawnum = ScriptNum.minimallyEncode(rawnum);
818
+ if (rawnum.length > targetSize) {
819
+ return opcodeFailure(ScriptError.IMPOSSIBLE_ENCODING);
820
+ }
821
+ if (rawnum.length === targetSize) {
822
+ stackset(stack, -1, rawnum);
823
+ return opcodeSuccess();
824
+ }
825
+ let signbit = 0x00;
826
+ if (rawnum.length > 0) {
827
+ signbit = rawnum[rawnum.length - 1] & 0x80;
828
+ rawnum[rawnum.length - 1] &= 0x7f;
829
+ }
830
+ const padded = BufferUtil.alloc(targetSize, 0);
831
+ rawnum.copy(padded);
832
+ padded[targetSize - 1] = signbit;
833
+ stackset(stack, -1, padded);
834
+ return opcodeSuccess();
835
+ }
836
+ case Opcode.OP_BIN2NUM: {
837
+ if (stack.length < 1) {
838
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
839
+ }
840
+ const encoded = ScriptNum.minimallyEncode(stacktop(stack, -1));
841
+ if (!ScriptNum.isMinimallyEncoded(encoded)) {
842
+ return opcodeFailure(ScriptError.INVALID_NUMBER_RANGE);
843
+ }
844
+ stackset(stack, -1, encoded);
845
+ return opcodeSuccess();
846
+ }
847
+ case Opcode.OP_RAWLEFTBITSHIFT: {
848
+ if (stack.length < 2) {
849
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
850
+ }
851
+ const shiftData = stacktop(stack, -2);
852
+ const signedBitshift = ScriptNum.fromBuffer(stacktop(stack, -1), true).toNumber();
853
+ popstack(stack);
854
+ if (shiftData.length === 0 || signedBitshift === 0) {
855
+ stackset(stack, -1, shiftData);
856
+ return opcodeSuccess();
857
+ }
858
+ let bitshift = Math.abs(signedBitshift);
859
+ if (bitshift > shiftData.length * 8) {
860
+ bitshift = shiftData.length * 8;
861
+ }
862
+ const innerBitshift = bitshift % 8;
863
+ const byteshift = Math.floor(bitshift / 8);
864
+ if (signedBitshift > 0) {
865
+ const mask = 0xff >> innerBitshift;
866
+ for (let idx = byteshift; idx < shiftData.length; idx++) {
867
+ const bits = shiftData[idx];
868
+ const off = idx - byteshift;
869
+ const removeMask = mask << innerBitshift;
870
+ shiftData[off] &= ~removeMask & 0xff;
871
+ shiftData[off] |= (bits & mask) << innerBitshift;
872
+ if (off > 0) {
873
+ const removeMaskCarry = (~mask & 0xff) >> (8 - innerBitshift);
874
+ shiftData[off - 1] &= ~removeMaskCarry & 0xff;
875
+ shiftData[off - 1] |= (bits & ~mask & 0xff) >> (8 - innerBitshift);
876
+ }
877
+ }
878
+ if (byteshift < shiftData.length) {
879
+ shiftData[shiftData.length - byteshift - 1] &=
880
+ (0xff << innerBitshift) & 0xff;
881
+ }
882
+ for (let i = shiftData.length - byteshift; i < shiftData.length; i++) {
883
+ shiftData[i] = 0;
884
+ }
885
+ }
886
+ else {
887
+ const mask = (0xff << innerBitshift) & 0xff;
888
+ for (let idx = shiftData.length - byteshift - 1; idx >= 0; idx--) {
889
+ const bits = shiftData[idx];
890
+ const off = idx + byteshift;
891
+ const removeMask = (mask >> innerBitshift) & 0xff;
892
+ shiftData[off] &= ~removeMask & 0xff;
893
+ shiftData[off] |= (bits & mask) >> innerBitshift;
894
+ if (off + 1 < shiftData.length) {
895
+ const removeMaskCarry = ((~mask & 0xff) << (8 - innerBitshift)) & 0xff;
896
+ shiftData[off + 1] &= ~removeMaskCarry & 0xff;
897
+ shiftData[off + 1] |=
898
+ ((bits & ~mask & 0xff) << (8 - innerBitshift)) & 0xff;
899
+ }
900
+ }
901
+ for (let i = 0; i < byteshift; i++) {
902
+ shiftData[i] = 0;
903
+ }
904
+ if (byteshift < shiftData.length) {
905
+ shiftData[byteshift] &= (0xff >> innerBitshift) & 0xff;
906
+ }
907
+ }
908
+ stackset(stack, -1, shiftData);
909
+ return opcodeSuccess();
910
+ }
911
+ default:
912
+ return opcodeFailure(ScriptError.BAD_OPCODE);
913
+ }
914
+ }
915
+ function executeCheckmultisig(opcode, stack, flags, checker, metrics, execdata, scriptBuf, codeHashBegin, _currentOffset, nOpCount) {
916
+ if (stack.length < 1) {
917
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
918
+ }
919
+ const nKeysCount = ScriptNum.fromBuffer(stacktop(stack, -1), true).toNumber();
920
+ if (nKeysCount < 0 || nKeysCount > MAX_PUBKEYS_PER_MULTISIG) {
921
+ return opcodeFailure(ScriptError.PUBKEY_COUNT);
922
+ }
923
+ let updatedOpCount = nOpCount + nKeysCount;
924
+ if (updatedOpCount > MAX_OPS_PER_SCRIPT) {
925
+ return opcodeFailure(ScriptError.OP_COUNT);
926
+ }
927
+ const idxTopKey = 2;
928
+ const idxSigCount = idxTopKey + nKeysCount;
929
+ if (stack.length < idxSigCount) {
930
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
931
+ }
932
+ const nSigsCount = ScriptNum.fromBuffer(stacktop(stack, -idxSigCount), true).toNumber();
933
+ if (nSigsCount < 0 || nSigsCount > nKeysCount) {
934
+ return opcodeFailure(ScriptError.SIG_COUNT);
935
+ }
936
+ const idxTopSig = idxSigCount + 1;
937
+ const idxDummy = idxTopSig + nSigsCount;
938
+ if (stack.length < idxDummy) {
939
+ return opcodeFailure(ScriptError.INVALID_STACK_OPERATION);
940
+ }
941
+ const scriptCode = scriptBuf.slice(codeHashBegin);
942
+ let fSuccess = true;
943
+ const dummyElement = stacktop(stack, -idxDummy);
944
+ if (dummyElement.length !== 0) {
945
+ let checkBits = 0;
946
+ for (let i = 0; i < dummyElement.length; i++) {
947
+ checkBits |= dummyElement[i] << (8 * i);
948
+ }
949
+ let bitCount = 0;
950
+ let tmp = checkBits;
951
+ while (tmp) {
952
+ bitCount += tmp & 1;
953
+ tmp >>>= 1;
954
+ }
955
+ if (bitCount !== nSigsCount) {
956
+ return opcodeFailure(ScriptError.INVALID_BIT_COUNT);
957
+ }
958
+ const idxBottomKey = idxTopKey + nKeysCount - 1;
959
+ const idxBottomSig = idxTopSig + nSigsCount - 1;
960
+ let iKey = 0;
961
+ for (let iSig = 0; iSig < nSigsCount; iSig++, iKey++) {
962
+ if (checkBits >>> iKey === 0) {
963
+ return opcodeFailure(ScriptError.INVALID_BIT_RANGE);
964
+ }
965
+ while (((checkBits >>> iKey) & 0x01) === 0) {
966
+ iKey++;
967
+ }
968
+ if (iKey >= nKeysCount) {
969
+ return opcodeFailure(ScriptError.PUBKEY_COUNT);
970
+ }
971
+ const vchSig = stacktop(stack, -idxBottomSig + iSig);
972
+ const vchPubKey = stacktop(stack, -idxBottomKey + iKey);
973
+ if (!checker.checkSignature(vchSig, vchPubKey, execdata, scriptCode, flags)) {
974
+ return opcodeFailure(ScriptError.SIG_NULLFAIL);
975
+ }
976
+ metrics.sigChecks += 1;
977
+ }
978
+ if (checkBits >>> iKey !== 0) {
979
+ return opcodeFailure(ScriptError.INVALID_BIT_COUNT);
980
+ }
981
+ }
982
+ else {
983
+ let nSigsRemaining = nSigsCount;
984
+ let nKeysRemaining = nKeysCount;
985
+ while (fSuccess && nSigsRemaining > 0) {
986
+ const vchSig = stacktop(stack, -idxTopSig - (nSigsCount - nSigsRemaining));
987
+ const vchPubKey = stacktop(stack, -idxTopKey - (nKeysCount - nKeysRemaining));
988
+ const fOk = checker.checkSignature(vchSig, vchPubKey, execdata, scriptCode, flags);
989
+ if (fOk) {
990
+ nSigsRemaining--;
991
+ }
992
+ nKeysRemaining--;
993
+ if (nSigsRemaining > nKeysRemaining) {
994
+ fSuccess = false;
995
+ }
996
+ }
997
+ let allSigsNull = true;
998
+ for (let i = 0; i < nSigsCount; i++) {
999
+ if (stacktop(stack, -idxTopSig - i).length > 0) {
1000
+ allSigsNull = false;
1001
+ break;
1002
+ }
1003
+ }
1004
+ if (!fSuccess && !allSigsNull) {
1005
+ return opcodeFailure(ScriptError.SIG_NULLFAIL);
1006
+ }
1007
+ if (!allSigsNull) {
1008
+ metrics.sigChecks += nKeysCount;
1009
+ }
1010
+ }
1011
+ for (let i = 0; i < idxDummy; i++) {
1012
+ popstack(stack);
1013
+ }
1014
+ stack.push(fSuccess ? TRUE_BUFFER : FALSE_BUFFER);
1015
+ if (opcode === Opcode.OP_CHECKMULTISIGVERIFY) {
1016
+ if (fSuccess) {
1017
+ popstack(stack);
1018
+ }
1019
+ else {
1020
+ return opcodeFailure(ScriptError.CHECKMULTISIGVERIFY);
1021
+ }
1022
+ }
1023
+ return opcodeSuccess({ nOpCount: updatedOpCount });
1024
+ }
1025
+ function isPayToTaproot(scriptPubKey) {
1026
+ if (scriptPubKey.length < TAPROOT_SIZE_WITHOUT_STATE) {
1027
+ return false;
1028
+ }
1029
+ if (scriptPubKey[0] !== Opcode.OP_SCRIPTTYPE ||
1030
+ scriptPubKey[1] !== TAPROOT_SCRIPTTYPE) {
1031
+ return false;
1032
+ }
1033
+ if (scriptPubKey[2] !== 33) {
1034
+ return false;
1035
+ }
1036
+ if (scriptPubKey.length === TAPROOT_SIZE_WITHOUT_STATE) {
1037
+ return true;
1038
+ }
1039
+ return (scriptPubKey.length === TAPROOT_SIZE_WITH_STATE &&
1040
+ scriptPubKey[TAPROOT_SIZE_WITHOUT_STATE] === 32);
1041
+ }
1042
+ function checkTaprootKeySpendSigEncoding(sig) {
1043
+ if (sig.length === 0) {
1044
+ return null;
1045
+ }
1046
+ if (sig.length !== 65) {
1047
+ return ScriptError.SIG_BADLENGTH;
1048
+ }
1049
+ const hashtype = sig[sig.length - 1];
1050
+ if ((hashtype & Signature.SIGHASH_ALGORITHM_MASK) !==
1051
+ Signature.SIGHASH_LOTUS) {
1052
+ return ScriptError.TAPROOT_KEY_SPEND_MUST_USE_LOTUS_SIGHASH;
1053
+ }
1054
+ return null;
1055
+ }
1056
+ function checkPubKeyEncoding(pubkey) {
1057
+ if (pubkey.length === 33) {
1058
+ if (pubkey[0] === 0x02 || pubkey[0] === 0x03) {
1059
+ return null;
1060
+ }
1061
+ }
1062
+ else if (pubkey.length === 65) {
1063
+ if (pubkey[0] === 0x04) {
1064
+ return null;
1065
+ }
1066
+ }
1067
+ return ScriptError.PUBKEYTYPE;
1068
+ }
1069
+ function verifyTaprootSpend(stack, scriptSig, scriptPubKey, flags, checker, metrics) {
1070
+ if (flags & ScriptFlags.DISABLE_TAPROOT_SIGHASH_LOTUS) {
1071
+ return failure(ScriptError.TAPROOT_PHASEOUT);
1072
+ }
1073
+ if (!isPayToTaproot(scriptPubKey)) {
1074
+ return failure(ScriptError.SCRIPTTYPE_MALFORMED_SCRIPT);
1075
+ }
1076
+ const vchPubkey = scriptPubKey.slice(TAPROOT_INTRO_SIZE, TAPROOT_SIZE_WITHOUT_STATE);
1077
+ if (stack.length === 0) {
1078
+ return failure(ScriptError.INVALID_STACK_OPERATION);
1079
+ }
1080
+ if (stack.length >= 2 &&
1081
+ stack[stack.length - 1].length > 0 &&
1082
+ stack[stack.length - 1][0] === TAPROOT_ANNEX_TAG) {
1083
+ return failure(ScriptError.TAPROOT_ANNEX_NOT_SUPPORTED);
1084
+ }
1085
+ if (stack.length === 1) {
1086
+ const vchSig = stack[stack.length - 1];
1087
+ const sigFlags = flags | ScriptFlags.TAPROOT_KEY_SPEND_PATH;
1088
+ const sigErr = checkTaprootKeySpendSigEncoding(vchSig);
1089
+ if (sigErr !== null) {
1090
+ return failure(sigErr);
1091
+ }
1092
+ const pkErr = checkPubKeyEncoding(vchPubkey);
1093
+ if (pkErr !== null) {
1094
+ return failure(pkErr);
1095
+ }
1096
+ if (vchSig.length === 0 ||
1097
+ !checker.checkSignature(vchSig, vchPubkey, undefined, BufferUtil.alloc(0), sigFlags)) {
1098
+ return failure(ScriptError.TAPROOT_VERIFY_SIGNATURE_FAILED);
1099
+ }
1100
+ metrics.sigChecks += 1;
1101
+ return success();
1102
+ }
1103
+ const controlBlock = stack[stack.length - 1];
1104
+ const scriptBytes = stack[stack.length - 2];
1105
+ const execScript = scriptBytes;
1106
+ stack.pop();
1107
+ stack.pop();
1108
+ const sizeRemainder = (controlBlock.length - TAPROOT_CONTROL_BASE_SIZE) %
1109
+ TAPROOT_CONTROL_NODE_SIZE;
1110
+ if (controlBlock.length < TAPROOT_CONTROL_BASE_SIZE ||
1111
+ controlBlock.length > TAPROOT_CONTROL_MAX_SIZE ||
1112
+ sizeRemainder !== 0) {
1113
+ return failure(ScriptError.TAPROOT_WRONG_CONTROL_SIZE);
1114
+ }
1115
+ if ((controlBlock[0] & TAPROOT_LEAF_MASK) !== TAPROOT_LEAF_TAPSCRIPT) {
1116
+ return failure(ScriptError.TAPROOT_LEAF_VERSION_NOT_SUPPORTED);
1117
+ }
1118
+ const commitResult = verifyTaprootCommitment(controlBlock, vchPubkey, Script.fromBuffer(execScript));
1119
+ if (!commitResult.success) {
1120
+ return failure(ScriptError.TAPROOT_VERIFY_COMMITMENT_FAILED);
1121
+ }
1122
+ if (scriptPubKey.length === TAPROOT_SIZE_WITH_STATE) {
1123
+ const stateStart = TAPROOT_SIZE_WITHOUT_STATE + 1;
1124
+ const stateEnd = TAPROOT_SIZE_WITH_STATE;
1125
+ stack.push(scriptPubKey.slice(stateStart, stateEnd));
1126
+ }
1127
+ const taprootExecdata = {
1128
+ codeseparatorPos: 0xffffffff,
1129
+ executedScriptHash: commitResult.tapleafHash,
1130
+ };
1131
+ const evalResult = evalScript(stack, execScript, flags, checker, metrics, taprootExecdata);
1132
+ if (!evalResult.success) {
1133
+ return evalResult;
1134
+ }
1135
+ if (stack.length === 0 || !castToBool(stack[stack.length - 1])) {
1136
+ return failure(ScriptError.EVAL_FALSE);
1137
+ }
1138
+ return verifyPostConditions(stack, scriptSig, flags, metrics);
1139
+ }
1140
+ function verifyScriptType(stack, scriptSig, scriptPubKey, flags, checker, metrics) {
1141
+ if (scriptPubKey.length === 1) {
1142
+ return failure(ScriptError.SCRIPTTYPE_MALFORMED_SCRIPT);
1143
+ }
1144
+ if (scriptPubKey[1] === TAPROOT_SCRIPTTYPE) {
1145
+ return verifyTaprootSpend(stack, scriptSig, scriptPubKey, flags, checker, metrics);
1146
+ }
1147
+ return failure(ScriptError.SCRIPTTYPE_INVALID_TYPE);
1148
+ }
1149
+ function verifyPostConditions(stack, scriptSig, flags, metrics) {
1150
+ if (flags & ScriptFlags.VERIFY_CLEANSTACK) {
1151
+ if (stack.length !== 1) {
1152
+ return failure(ScriptError.CLEANSTACK);
1153
+ }
1154
+ }
1155
+ if (flags & ScriptFlags.VERIFY_INPUT_SIGCHECKS) {
1156
+ if (scriptSig.length < metrics.sigChecks * 43 - 60) {
1157
+ return failure(ScriptError.INPUT_SIGCHECKS);
1158
+ }
1159
+ }
1160
+ return success();
1161
+ }
1162
+ export function verifyScript(scriptSig, scriptPubKey, flags, checker) {
1163
+ if (!isPushOnly(scriptSig)) {
1164
+ return failure(ScriptError.SIG_PUSHONLY);
1165
+ }
1166
+ const metrics = { sigChecks: 0 };
1167
+ const stack = [];
1168
+ const sigExecdata = makeExecdata(BufferUtil.alloc(0));
1169
+ const sigResult = evalScript(stack, scriptSig, flags, checker, metrics, sigExecdata);
1170
+ if (!sigResult.success) {
1171
+ return sigResult;
1172
+ }
1173
+ if (scriptPubKey.length > 0 && scriptPubKey[0] === Opcode.OP_SCRIPTTYPE) {
1174
+ const stResult = verifyScriptType(stack, scriptSig, scriptPubKey, flags, checker, metrics);
1175
+ return stResult;
1176
+ }
1177
+ const stackCopy = stack.map(el => el.slice());
1178
+ const pubkeyExecdata = makeExecdata(scriptPubKey);
1179
+ const pubkeyResult = evalScript(stack, scriptPubKey, flags, checker, metrics, pubkeyExecdata);
1180
+ if (!pubkeyResult.success) {
1181
+ return pubkeyResult;
1182
+ }
1183
+ if (stack.length === 0) {
1184
+ return failure(ScriptError.EVAL_FALSE);
1185
+ }
1186
+ if (!castToBool(stack[stack.length - 1])) {
1187
+ return failure(ScriptError.EVAL_FALSE);
1188
+ }
1189
+ if (isPayToScriptHash(scriptPubKey)) {
1190
+ if (!isPushOnly(scriptSig)) {
1191
+ return failure(ScriptError.SIG_PUSHONLY);
1192
+ }
1193
+ const p2shStack = stackCopy;
1194
+ if (p2shStack.length === 0) {
1195
+ return failure(ScriptError.EVAL_FALSE);
1196
+ }
1197
+ const serializedScript = p2shStack[p2shStack.length - 1];
1198
+ p2shStack.pop();
1199
+ const p2shExecdata = makeExecdata(serializedScript);
1200
+ const p2shResult = evalScript(p2shStack, serializedScript, flags, checker, metrics, p2shExecdata);
1201
+ if (!p2shResult.success) {
1202
+ return p2shResult;
1203
+ }
1204
+ if (p2shStack.length === 0) {
1205
+ return failure(ScriptError.EVAL_FALSE);
1206
+ }
1207
+ if (!castToBool(p2shStack[p2shStack.length - 1])) {
1208
+ return failure(ScriptError.EVAL_FALSE);
1209
+ }
1210
+ stack.length = 0;
1211
+ stack.push(...p2shStack);
1212
+ }
1213
+ return verifyPostConditions(stack, scriptSig, flags, metrics);
1214
+ }
1215
+ function isPushOnly(scriptBuf) {
1216
+ let offset = 0;
1217
+ while (offset < scriptBuf.length) {
1218
+ const instr = readInstruction(scriptBuf, offset);
1219
+ if (!instr) {
1220
+ return false;
1221
+ }
1222
+ if (instr.opcode > Opcode.OP_16) {
1223
+ return false;
1224
+ }
1225
+ offset = instr.nextOffset;
1226
+ }
1227
+ return true;
1228
+ }
1229
+ function isPayToScriptHash(scriptBuf) {
1230
+ return (scriptBuf.length === 23 &&
1231
+ scriptBuf[0] === Opcode.OP_HASH160 &&
1232
+ scriptBuf[1] === 0x14 &&
1233
+ scriptBuf[22] === Opcode.OP_EQUAL);
1234
+ }
1235
+ function makeExecdata(script) {
1236
+ return {
1237
+ codeseparatorPos: 0xffffffff,
1238
+ executedScriptHash: Hash.sha256sha256(script.length > 0 ? script : BufferUtil.alloc(0)),
1239
+ };
1240
+ }
1241
+ export class Interpreter {
1242
+ errstr = '';
1243
+ static SCRIPT_VERIFY_NONE = ScriptFlags.VERIFY_NONE;
1244
+ static SCRIPT_TAPROOT_KEY_SPEND_PATH = ScriptFlags.TAPROOT_KEY_SPEND_PATH;
1245
+ static SCRIPT_DISABLE_TAPROOT_SIGHASH_LOTUS = ScriptFlags.DISABLE_TAPROOT_SIGHASH_LOTUS;
1246
+ static SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS = ScriptFlags.VERIFY_DISCOURAGE_UPGRADABLE_NOPS;
1247
+ static SCRIPT_VERIFY_CLEANSTACK = ScriptFlags.VERIFY_CLEANSTACK;
1248
+ static SCRIPT_VERIFY_MINIMALIF = ScriptFlags.VERIFY_MINIMALIF;
1249
+ static SCRIPT_ENABLE_SIGHASH_FORKID = ScriptFlags.ENABLE_SIGHASH_FORKID;
1250
+ static SCRIPT_ENABLE_REPLAY_PROTECTION = ScriptFlags.ENABLE_REPLAY_PROTECTION;
1251
+ static SCRIPT_VERIFY_INPUT_SIGCHECKS = ScriptFlags.VERIFY_INPUT_SIGCHECKS;
1252
+ verify(scriptSig, scriptPubKey, tx, nin, flags, satoshis) {
1253
+ this.errstr = '';
1254
+ const sigBuf = scriptSig.toBuffer();
1255
+ const pubkeyBuf = scriptPubKey.toBuffer();
1256
+ const checker = new TransactionSignatureChecker(tx, nin, satoshis);
1257
+ const result = verifyScript(sigBuf, pubkeyBuf, flags, checker);
1258
+ if (!result.success) {
1259
+ this.errstr = result.error;
1260
+ }
1261
+ return result.success;
1262
+ }
1263
+ }
1264
+ class TransactionSignatureChecker {
1265
+ tx;
1266
+ nin;
1267
+ satoshis;
1268
+ constructor(tx, nin, satoshis) {
1269
+ this.tx = tx;
1270
+ this.nin = nin;
1271
+ this.satoshis = satoshis;
1272
+ }
1273
+ verifySignature(signature, publicKey, sighash) {
1274
+ try {
1275
+ const pubkey = PublicKey.fromBuffer(publicKey);
1276
+ if (isSchnorrSignature(signature)) {
1277
+ const sig = Signature.fromSchnorr(signature);
1278
+ return Schnorr.verify(sighash, sig, pubkey);
1279
+ }
1280
+ else {
1281
+ const sig = Signature.fromDER(signature);
1282
+ const ecdsa = new ECDSA();
1283
+ ecdsa.hashbuf = sighash;
1284
+ ecdsa.sig = sig;
1285
+ ecdsa.pubkey = pubkey;
1286
+ ecdsa.verify();
1287
+ return ecdsa.verified;
1288
+ }
1289
+ }
1290
+ catch {
1291
+ return false;
1292
+ }
1293
+ }
1294
+ checkSignature(signature, publicKey, execdata, scriptCode, flags) {
1295
+ if (signature.length === 0) {
1296
+ return false;
1297
+ }
1298
+ try {
1299
+ const hashtype = signature[signature.length - 1];
1300
+ const rawSig = signature.slice(0, signature.length - 1);
1301
+ const subscript = Script.fromBuffer(scriptCode);
1302
+ const sighashBuf = computeSighash(this.tx, hashtype, this.nin, subscript, this.satoshis !== undefined
1303
+ ? BN.fromNumber(Number(this.satoshis))
1304
+ : undefined, flags);
1305
+ return this.verifySignature(rawSig, publicKey, sighashBuf);
1306
+ }
1307
+ catch {
1308
+ return false;
1309
+ }
1310
+ }
1311
+ checkLockTime(lockTime) {
1312
+ const LOCKTIME_THRESHOLD = 500000000n;
1313
+ const txLockTime = BigInt(this.tx.nLockTime || 0);
1314
+ if ((txLockTime < LOCKTIME_THRESHOLD && lockTime >= LOCKTIME_THRESHOLD) ||
1315
+ (txLockTime >= LOCKTIME_THRESHOLD && lockTime < LOCKTIME_THRESHOLD)) {
1316
+ return false;
1317
+ }
1318
+ if (lockTime > txLockTime) {
1319
+ return false;
1320
+ }
1321
+ const input = this.tx.inputs?.[this.nin];
1322
+ if (input && input.sequenceNumber === 0xffffffff) {
1323
+ return false;
1324
+ }
1325
+ return true;
1326
+ }
1327
+ checkSequence(sequence) {
1328
+ const SEQUENCE_LOCKTIME_DISABLE_FLAG = 1n << 31n;
1329
+ const SEQUENCE_LOCKTIME_TYPE_FLAG = 1n << 22n;
1330
+ const SEQUENCE_LOCKTIME_MASK = 0x0000ffffn;
1331
+ if (sequence & SEQUENCE_LOCKTIME_DISABLE_FLAG) {
1332
+ return true;
1333
+ }
1334
+ const txVersion = this.tx.version || 1;
1335
+ if (txVersion < 2) {
1336
+ return false;
1337
+ }
1338
+ const input = this.tx.inputs?.[this.nin];
1339
+ if (!input) {
1340
+ return false;
1341
+ }
1342
+ const txSequence = BigInt(input.sequenceNumber || 0);
1343
+ if (txSequence & SEQUENCE_LOCKTIME_DISABLE_FLAG) {
1344
+ return false;
1345
+ }
1346
+ if ((sequence & SEQUENCE_LOCKTIME_TYPE_FLAG) !==
1347
+ (txSequence & SEQUENCE_LOCKTIME_TYPE_FLAG)) {
1348
+ return false;
1349
+ }
1350
+ if ((sequence & SEQUENCE_LOCKTIME_MASK) >
1351
+ (txSequence & SEQUENCE_LOCKTIME_MASK)) {
1352
+ return false;
1353
+ }
1354
+ return true;
1355
+ }
1356
+ }