@opcat-labs/opcat 1.0.1 → 1.0.3

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 (293) hide show
  1. package/.cjs2esm.json +18 -0
  2. package/.mocharc.yaml +1 -1
  3. package/CHANGELOG.md +12 -0
  4. package/README.md +6 -0
  5. package/{lib/address.js → cjs/address.cjs} +77 -72
  6. package/cjs/block/block.cjs +332 -0
  7. package/{lib/block/blockheader.js → cjs/block/blockheader.cjs} +8 -7
  8. package/cjs/block/index.cjs +2 -0
  9. package/{lib/block/merkleblock.js → cjs/block/merkleblock.cjs} +23 -15
  10. package/cjs/bn.cjs +3411 -0
  11. package/{lib/crypto/bn.js → cjs/crypto/bn.cjs} +3 -3
  12. package/{lib/crypto/ecdsa.js → cjs/crypto/ecdsa.cjs} +150 -14
  13. package/{lib/crypto/hash.node.js → cjs/crypto/hash.cjs} +13 -2
  14. package/cjs/crypto/index.cjs +16 -0
  15. package/{lib/crypto/point.js → cjs/crypto/point.cjs} +11 -4
  16. package/cjs/crypto/random.cjs +18 -0
  17. package/{lib/crypto/signature.js → cjs/crypto/signature.cjs} +158 -8
  18. package/{lib/encoding/base58.js → cjs/encoding/base58.cjs} +58 -2
  19. package/cjs/encoding/base58check.cjs +192 -0
  20. package/cjs/encoding/bufferreader.cjs +333 -0
  21. package/cjs/encoding/bufferwriter.cjs +244 -0
  22. package/{lib/encoding/decode-asm.js → cjs/encoding/decode-asm.cjs} +4 -4
  23. package/{lib/encoding/decode-hex.js → cjs/encoding/decode-hex.cjs} +1 -1
  24. package/cjs/encoding/index.cjs +14 -0
  25. package/cjs/encoding/varint.cjs +116 -0
  26. package/{lib/errors/index.js → cjs/errors/index.cjs} +9 -9
  27. package/{lib/errors/spec.js → cjs/errors/spec.cjs} +2 -2
  28. package/cjs/hash-cache.cjs +98 -0
  29. package/{lib/hdprivatekey.js → cjs/hdprivatekey.cjs} +232 -140
  30. package/{lib/hdpublickey.js → cjs/hdpublickey.cjs} +120 -93
  31. package/cjs/index.cjs +94 -0
  32. package/cjs/interpreter/index.cjs +2 -0
  33. package/cjs/interpreter/interpreter.cjs +1988 -0
  34. package/{lib/script/stack.js → cjs/interpreter/stack.cjs} +9 -2
  35. package/{lib/message/message.js → cjs/message/message.cjs} +62 -25
  36. package/cjs/mnemonic/index.cjs +3 -0
  37. package/{lib/mnemonic/mnemonic.js → cjs/mnemonic/mnemonic.cjs} +44 -13
  38. package/{lib/mnemonic/pbkdf2.node.js → cjs/mnemonic/pbkdf2.cjs} +9 -2
  39. package/cjs/mnemonic/words/index.cjs +66 -0
  40. package/cjs/network.cjs +13 -0
  41. package/cjs/networks.cjs +321 -0
  42. package/{lib/opcode.js → cjs/opcode.cjs} +69 -5
  43. package/cjs/privatekey.cjs +422 -0
  44. package/{lib/publickey.js → cjs/publickey.cjs} +14 -16
  45. package/cjs/script/index.cjs +2 -0
  46. package/{lib/script/script.js → cjs/script/script.cjs} +322 -67
  47. package/cjs/transaction/index.cjs +5 -0
  48. package/cjs/transaction/input/index.cjs +34 -0
  49. package/cjs/transaction/input/input.cjs +396 -0
  50. package/{lib/transaction/input/multisig.js → cjs/transaction/input/multisig.cjs} +112 -18
  51. package/{lib/transaction/input/publickey.js → cjs/transaction/input/publickey.cjs} +29 -19
  52. package/{lib/transaction/input/publickeyhash.js → cjs/transaction/input/publickeyhash.cjs} +25 -17
  53. package/{lib/transaction/output.js → cjs/transaction/output.cjs} +100 -15
  54. package/cjs/transaction/sighash.cjs +187 -0
  55. package/{lib/transaction/signature.js → cjs/transaction/signature.cjs} +30 -6
  56. package/cjs/transaction/transaction.cjs +2000 -0
  57. package/{lib/transaction/unspentoutput.js → cjs/transaction/unspentoutput.cjs} +5 -5
  58. package/cjs/util/derivation.cjs +53 -0
  59. package/cjs/util/index.cjs +11 -0
  60. package/cjs/util/js.cjs +95 -0
  61. package/{lib/util/preconditions.js → cjs/util/preconditions.cjs} +2 -2
  62. package/esm/address.js +483 -0
  63. package/{lib → esm}/block/block.js +82 -27
  64. package/esm/block/blockheader.js +296 -0
  65. package/esm/block/index.js +2 -0
  66. package/esm/block/merkleblock.js +331 -0
  67. package/esm/bn.js +3411 -0
  68. package/esm/crypto/bn.js +278 -0
  69. package/esm/crypto/ecdsa.js +475 -0
  70. package/{lib/crypto/hash.browser.js → esm/crypto/hash.js} +18 -7
  71. package/esm/crypto/index.js +16 -0
  72. package/esm/crypto/point.js +228 -0
  73. package/esm/crypto/random.js +18 -0
  74. package/esm/crypto/signature.js +475 -0
  75. package/esm/encoding/base58.js +167 -0
  76. package/esm/encoding/base58check.js +192 -0
  77. package/esm/encoding/bufferreader.js +333 -0
  78. package/esm/encoding/bufferwriter.js +243 -0
  79. package/esm/encoding/decode-asm.js +24 -0
  80. package/esm/encoding/decode-hex.js +32 -0
  81. package/esm/encoding/decode-script-chunks.js +43 -0
  82. package/esm/encoding/encode-hex.js +284 -0
  83. package/esm/encoding/index.js +14 -0
  84. package/esm/encoding/is-hex.js +7 -0
  85. package/esm/encoding/varint.js +116 -0
  86. package/esm/errors/index.js +54 -0
  87. package/esm/errors/spec.js +314 -0
  88. package/esm/hash-cache.js +98 -0
  89. package/esm/hdprivatekey.js +768 -0
  90. package/esm/hdpublickey.js +549 -0
  91. package/esm/index.js +66 -0
  92. package/esm/interpreter/index.js +2 -0
  93. package/{lib/script → esm/interpreter}/interpreter.js +219 -66
  94. package/esm/interpreter/stack.js +116 -0
  95. package/esm/message/message.js +228 -0
  96. package/esm/mnemonic/index.js +3 -0
  97. package/esm/mnemonic/mnemonic.js +332 -0
  98. package/{lib/mnemonic/pbkdf2.browser.js → esm/mnemonic/pbkdf2.js} +13 -6
  99. package/esm/mnemonic/words/chinese.js +2054 -0
  100. package/esm/mnemonic/words/english.js +2054 -0
  101. package/esm/mnemonic/words/french.js +2054 -0
  102. package/esm/mnemonic/words/index.js +66 -0
  103. package/esm/mnemonic/words/italian.js +2054 -0
  104. package/esm/mnemonic/words/japanese.js +2054 -0
  105. package/esm/mnemonic/words/spanish.js +2054 -0
  106. package/esm/network.js +13 -0
  107. package/{lib → esm}/networks.js +61 -120
  108. package/esm/opcode.js +319 -0
  109. package/{lib → esm}/privatekey.js +76 -28
  110. package/esm/publickey.js +384 -0
  111. package/esm/script/index.js +2 -0
  112. package/esm/script/script.js +1329 -0
  113. package/esm/script/write-i32-le.js +17 -0
  114. package/esm/script/write-push-data.js +35 -0
  115. package/esm/script/write-u16-le.js +12 -0
  116. package/esm/script/write-u32-le.js +16 -0
  117. package/esm/script/write-u64-le.js +24 -0
  118. package/esm/script/write-u8-le.js +8 -0
  119. package/esm/script/write-varint.js +46 -0
  120. package/esm/transaction/index.js +5 -0
  121. package/esm/transaction/input/index.js +33 -0
  122. package/{lib → esm}/transaction/input/input.js +132 -90
  123. package/esm/transaction/input/multisig.js +335 -0
  124. package/esm/transaction/input/publickey.js +108 -0
  125. package/esm/transaction/input/publickeyhash.js +124 -0
  126. package/esm/transaction/output.js +316 -0
  127. package/{lib → esm}/transaction/sighash.js +42 -22
  128. package/esm/transaction/signature.js +120 -0
  129. package/{lib → esm}/transaction/transaction.js +522 -163
  130. package/esm/transaction/unspentoutput.js +112 -0
  131. package/esm/util/_.js +47 -0
  132. package/esm/util/derivation.js +53 -0
  133. package/esm/util/index.js +12 -0
  134. package/esm/util/js.js +95 -0
  135. package/esm/util/preconditions.js +33 -0
  136. package/fixup.cjs +17 -0
  137. package/package.json +18 -4
  138. package/test/{address.js → address.cjs} +14 -43
  139. package/test/block/{block.js → block.cjs} +3 -5
  140. package/test/block/{blockheader.js → blockheader.cjs} +2 -2
  141. package/test/block/{merklebloack.js → merklebloack.cjs} +2 -2
  142. package/test/crypto/{ecdsa.js → ecdsa.cjs} +9 -9
  143. package/test/crypto/{hash.browser.js → hash.browser.cjs} +2 -1
  144. package/test/crypto/{signature.js → signature.cjs} +2 -2
  145. package/test/data/bitcoind/script_tests.json +5 -5
  146. package/test/{hashCache.js → hashCache.cjs} +2 -1
  147. package/test/{hdkeys.js → hdkeys.cjs} +4 -2
  148. package/test/{hdprivatekey.js → hdprivatekey.cjs} +7 -6
  149. package/test/{hdpublickey.js → hdpublickey.cjs} +2 -7
  150. package/test/mnemonic/{pbkdf2.test.js → pbkdf2.test.cjs} +2 -2
  151. package/test/{networks.js → networks.cjs} +12 -31
  152. package/test/{publickey.js → publickey.cjs} +2 -2
  153. package/test/script/{interpreter.js → interpreter.cjs} +5 -5
  154. package/test/script/{script.js → script.cjs} +8 -2
  155. package/test/transaction/{deserialize.js → deserialize.cjs} +2 -2
  156. package/test/transaction/input/{input.js → input.cjs} +1 -1
  157. package/test/transaction/input/{multisig.js → multisig.cjs} +2 -1
  158. package/test/transaction/input/{publickeyhash.js → publickeyhash.cjs} +1 -1
  159. package/test/transaction/{sighash.js → sighash.cjs} +1 -1
  160. package/test/transaction/{transaction.js → transaction.cjs} +2 -2
  161. package/tsconfig.json +13 -0
  162. package/types/address.d.cts +252 -0
  163. package/types/block/block.d.cts +139 -0
  164. package/types/block/blockheader.d.cts +125 -0
  165. package/types/block/index.d.cts +2 -0
  166. package/types/block/merkleblock.d.cts +95 -0
  167. package/types/bn.d.cts +202 -0
  168. package/types/crypto/bn.d.cts +2 -0
  169. package/types/crypto/ecdsa.d.cts +187 -0
  170. package/types/crypto/hash.d.cts +118 -0
  171. package/types/crypto/index.d.cts +7 -0
  172. package/types/crypto/point.d.cts +134 -0
  173. package/types/crypto/random.d.cts +13 -0
  174. package/types/crypto/signature.d.cts +160 -0
  175. package/types/encoding/base58.d.cts +106 -0
  176. package/types/encoding/base58check.d.cts +107 -0
  177. package/types/encoding/bufferreader.d.cts +164 -0
  178. package/types/encoding/bufferwriter.d.cts +126 -0
  179. package/types/encoding/decode-asm.d.cts +2 -0
  180. package/types/encoding/decode-hex.d.cts +2 -0
  181. package/types/encoding/decode-script-chunks.d.cts +14 -0
  182. package/types/encoding/encode-hex.d.cts +2 -0
  183. package/types/encoding/index.d.cts +6 -0
  184. package/types/encoding/is-hex.d.cts +2 -0
  185. package/types/encoding/varint.d.cts +66 -0
  186. package/types/errors/index.d.cts +4 -0
  187. package/types/errors/spec.d.cts +22 -0
  188. package/types/hash-cache.d.cts +65 -0
  189. package/types/hdprivatekey.d.cts +281 -0
  190. package/types/hdpublickey.d.cts +240 -0
  191. package/types/index.d.cts +26 -0
  192. package/types/interpreter/index.d.cts +2 -0
  193. package/types/interpreter/interpreter.d.cts +228 -0
  194. package/types/interpreter/stack.d.cts +35 -0
  195. package/types/message/message.d.cts +110 -0
  196. package/types/mnemonic/index.d.cts +2 -0
  197. package/types/mnemonic/mnemonic.d.cts +171 -0
  198. package/types/mnemonic/pbkdf2.d.cts +14 -0
  199. package/types/mnemonic/words/chinese.d.cts +2 -0
  200. package/types/mnemonic/words/english.d.cts +2 -0
  201. package/types/mnemonic/words/french.d.cts +2 -0
  202. package/types/mnemonic/words/index.d.cts +22 -0
  203. package/types/mnemonic/words/italian.d.cts +2 -0
  204. package/types/mnemonic/words/japanese.d.cts +2 -0
  205. package/types/mnemonic/words/spanish.d.cts +2 -0
  206. package/types/network.d.cts +11 -0
  207. package/types/networks.d.cts +76 -0
  208. package/types/opcode.d.cts +93 -0
  209. package/types/privatekey.d.cts +169 -0
  210. package/types/publickey.d.cts +202 -0
  211. package/types/script/index.d.cts +2 -0
  212. package/types/script/script.d.cts +449 -0
  213. package/types/script/write-i32-le.d.cts +2 -0
  214. package/types/script/write-push-data.d.cts +2 -0
  215. package/types/script/write-u16-le.d.cts +2 -0
  216. package/types/script/write-u32-le.d.cts +2 -0
  217. package/types/script/write-u64-le.d.cts +2 -0
  218. package/types/script/write-u8-le.d.cts +2 -0
  219. package/types/script/write-varint.d.cts +2 -0
  220. package/types/transaction/index.d.cts +2 -0
  221. package/types/transaction/input/index.d.cts +2 -0
  222. package/types/transaction/input/input.d.cts +178 -0
  223. package/types/transaction/input/multisig.d.cts +127 -0
  224. package/types/transaction/input/publickey.d.cts +44 -0
  225. package/types/transaction/input/publickeyhash.d.cts +45 -0
  226. package/types/transaction/output.d.cts +118 -0
  227. package/types/transaction/sighash.d.cts +61 -0
  228. package/types/transaction/signature.d.cts +43 -0
  229. package/types/transaction/transaction.d.cts +716 -0
  230. package/types/transaction/unspentoutput.d.cts +83 -0
  231. package/types/util/_.d.cts +26 -0
  232. package/types/util/derivation.d.cts +21 -0
  233. package/types/util/index.d.cts +5 -0
  234. package/types/util/js.d.cts +50 -0
  235. package/types/util/preconditions.d.cts +3 -0
  236. package/index.d.ts +0 -1541
  237. package/index.js +0 -74
  238. package/lib/block/index.js +0 -4
  239. package/lib/bn.js +0 -3423
  240. package/lib/crypto/hash.js +0 -2
  241. package/lib/crypto/random.browser.js +0 -28
  242. package/lib/crypto/random.js +0 -2
  243. package/lib/crypto/random.node.js +0 -11
  244. package/lib/encoding/base58check.js +0 -121
  245. package/lib/encoding/bufferreader.js +0 -212
  246. package/lib/encoding/bufferwriter.js +0 -140
  247. package/lib/encoding/varint.js +0 -75
  248. package/lib/hash-cache.js +0 -50
  249. package/lib/mnemonic/pbkdf2.js +0 -2
  250. package/lib/mnemonic/words/index.js +0 -8
  251. package/lib/script/index.js +0 -5
  252. package/lib/transaction/index.js +0 -7
  253. package/lib/transaction/input/index.js +0 -5
  254. package/lib/util/js.js +0 -90
  255. /package/{lib/encoding/decode-script-chunks.js → cjs/encoding/decode-script-chunks.cjs} +0 -0
  256. /package/{lib/encoding/encode-hex.js → cjs/encoding/encode-hex.cjs} +0 -0
  257. /package/{lib/encoding/is-hex.js → cjs/encoding/is-hex.cjs} +0 -0
  258. /package/{lib/mnemonic/words/chinese.js → cjs/mnemonic/words/chinese.cjs} +0 -0
  259. /package/{lib/mnemonic/words/english.js → cjs/mnemonic/words/english.cjs} +0 -0
  260. /package/{lib/mnemonic/words/french.js → cjs/mnemonic/words/french.cjs} +0 -0
  261. /package/{lib/mnemonic/words/italian.js → cjs/mnemonic/words/italian.cjs} +0 -0
  262. /package/{lib/mnemonic/words/japanese.js → cjs/mnemonic/words/japanese.cjs} +0 -0
  263. /package/{lib/mnemonic/words/spanish.js → cjs/mnemonic/words/spanish.cjs} +0 -0
  264. /package/{lib/script/write-i32-le.js → cjs/script/write-i32-le.cjs} +0 -0
  265. /package/{lib/script/write-push-data.js → cjs/script/write-push-data.cjs} +0 -0
  266. /package/{lib/script/write-u16-le.js → cjs/script/write-u16-le.cjs} +0 -0
  267. /package/{lib/script/write-u32-le.js → cjs/script/write-u32-le.cjs} +0 -0
  268. /package/{lib/script/write-u64-le.js → cjs/script/write-u64-le.cjs} +0 -0
  269. /package/{lib/script/write-u8-le.js → cjs/script/write-u8-le.cjs} +0 -0
  270. /package/{lib/script/write-varint.js → cjs/script/write-varint.cjs} +0 -0
  271. /package/{lib/util/_.js → cjs/util/_.cjs} +0 -0
  272. /package/test/crypto/{bn.js → bn.cjs} +0 -0
  273. /package/test/crypto/{hash.js → hash.cjs} +0 -0
  274. /package/test/crypto/{point.js → point.cjs} +0 -0
  275. /package/test/crypto/{random.js → random.cjs} +0 -0
  276. /package/test/data/{blk86756-testnet.js → blk86756-testnet.cjs} +0 -0
  277. /package/test/data/{merkleblocks.js → merkleblocks.cjs} +0 -0
  278. /package/test/encoding/{base58.js → base58.cjs} +0 -0
  279. /package/test/encoding/{base58check.js → base58check.cjs} +0 -0
  280. /package/test/encoding/{bufferreader.js → bufferreader.cjs} +0 -0
  281. /package/test/encoding/{bufferwriter.js → bufferwriter.cjs} +0 -0
  282. /package/test/encoding/{varint.js → varint.cjs} +0 -0
  283. /package/test/{index.js → index.cjs} +0 -0
  284. /package/test/message/{message.js → message.cjs} +0 -0
  285. /package/test/mnemonic/{mnemonic.js → mnemonic.cjs} +0 -0
  286. /package/test/{opcode.js → opcode.cjs} +0 -0
  287. /package/test/{privatekey.js → privatekey.cjs} +0 -0
  288. /package/test/transaction/input/{publickey.js → publickey.cjs} +0 -0
  289. /package/test/transaction/{output.js → output.cjs} +0 -0
  290. /package/test/transaction/{signature.js → signature.cjs} +0 -0
  291. /package/test/transaction/{unspentoutput.js → unspentoutput.cjs} +0 -0
  292. /package/test/util/{js.js → js.cjs} +0 -0
  293. /package/test/util/{preconditions.js → preconditions.cjs} +0 -0
@@ -0,0 +1,17 @@
1
+ function writeI32LE(writer, n) {
2
+ if (n < -2147483648 || n > 2147483647)
3
+ throw new Error('Out of range. It must be >= -2147483648 and <= 2147483647.');
4
+
5
+ const buffer = new Uint8Array(4);
6
+ buffer[0] = n % 256;
7
+ n = Math.floor(n / 256);
8
+ buffer[1] = n % 256;
9
+ n = n >> 8;
10
+ buffer[2] = n % 256;
11
+ n = n >> 8;
12
+ buffer[3] = n;
13
+
14
+ return writer.write(buffer);
15
+ }
16
+
17
+ export default writeI32LE;
@@ -0,0 +1,35 @@
1
+ function writePushData(writer, buffer) {
2
+ // It is possible to optimize buffers that only store numbers 1-16, or -1, by using the OP_N opcodes.
3
+ // But we say "push data" is always stored using OP_0 or OP_PUSH(N) so that it's easy to identify and
4
+ // extract, and also because there is some ambiguity around OP_0 if we don't do this.
5
+ if (buffer.length === 0) {
6
+ writer.write([0]);
7
+ } else if (buffer.length <= 75) {
8
+ writer.write([buffer.length]); // OP_PUSH(buffer.length)
9
+ writer.write(buffer);
10
+ } else if (buffer.length <= 0xff) {
11
+ writer.write([76, buffer.length]); // OP_PUSHDATA1
12
+ writer.write(buffer);
13
+ } else if (buffer.length <= 0xffff) {
14
+ writer.write([77, buffer.length % 256, buffer.length >> 8]); // OP_PUSHDATA2
15
+ writer.write(buffer);
16
+ } else if (buffer.length <= 0xffffffff) {
17
+ const prefix = new Uint8Array(5);
18
+ prefix[0] = 78; // OP_PUSHDATA4
19
+ let n = buffer.length;
20
+ prefix[1] = n % 256;
21
+ n = Math.floor(n / 256);
22
+ prefix[2] = n % 256;
23
+ n = Math.floor(n / 256);
24
+ prefix[3] = n % 256;
25
+ n = Math.floor(n / 256);
26
+ prefix[4] = n;
27
+ writer.write(prefix);
28
+ writer.write(buffer);
29
+ } else {
30
+ throw new Error('data too large');
31
+ }
32
+ return writer;
33
+ }
34
+
35
+ export default writePushData;
@@ -0,0 +1,12 @@
1
+ function writeU16LE(writer, n) {
2
+ if (n > 0xffff) throw new Error('number too large');
3
+
4
+ const buffer = new Uint8Array(2);
5
+ buffer[0] = n % 256;
6
+ n = n >> 8;
7
+ buffer[1] = n % 256;
8
+
9
+ return writer.write(buffer);
10
+ }
11
+
12
+ export default writeU16LE;
@@ -0,0 +1,16 @@
1
+ function writeU32LE(writer, n) {
2
+ if (n > 0xffffffff) throw new Error('number too large');
3
+
4
+ const buffer = new Uint8Array(4);
5
+ buffer[0] = n % 256;
6
+ n = Math.floor(n / 256);
7
+ buffer[1] = n % 256;
8
+ n = n >> 8;
9
+ buffer[2] = n % 256;
10
+ n = n >> 8;
11
+ buffer[3] = n;
12
+
13
+ return writer.write(buffer);
14
+ }
15
+
16
+ export default writeU32LE;
@@ -0,0 +1,24 @@
1
+ function writeU64LE(writer, n) {
2
+ if (n > Number.MAX_SAFE_INTEGER) throw new Error('number too large');
3
+
4
+ const buffer = new Uint8Array(8);
5
+ buffer[0] = n % 256;
6
+ n = Math.floor(n / 256);
7
+ buffer[1] = n % 256;
8
+ n = Math.floor(n / 256);
9
+ buffer[2] = n % 256;
10
+ n = Math.floor(n / 256);
11
+ buffer[3] = n % 256;
12
+ n = Math.floor(n / 256);
13
+ buffer[4] = n % 256;
14
+ n = Math.floor(n / 256);
15
+ buffer[5] = n % 256;
16
+ n = n >> 8;
17
+ buffer[6] = n % 256;
18
+ n = n >> 8;
19
+ buffer[7] = n;
20
+
21
+ return writer.write(buffer);
22
+ }
23
+
24
+ export default writeU64LE;
@@ -0,0 +1,8 @@
1
+ function writeU8LE(writer, n) {
2
+ if (n > 0xff) throw new Error('number too large');
3
+ const buffer = new Uint8Array(1);
4
+ buffer[0] = n;
5
+ return writer.write(buffer);
6
+ }
7
+
8
+ export default writeU8LE;
@@ -0,0 +1,46 @@
1
+ function writeVarint(writer, n) {
2
+ if (n > Number.MAX_SAFE_INTEGER) throw new Error('varint too large');
3
+
4
+ if (n <= 0xfc) {
5
+ return writer.write([n]);
6
+ }
7
+
8
+ if (n <= 0xffff) {
9
+ return writer.write([0xfd, n % 256, Math.floor(n / 256)]);
10
+ }
11
+
12
+ if (n <= 0xffffffff) {
13
+ const buffer = new Uint8Array(5);
14
+ buffer[0] = 0xfe;
15
+ buffer[1] = n % 256;
16
+ n = Math.floor(n / 256);
17
+ buffer[2] = n % 256;
18
+ n = Math.floor(n / 256);
19
+ buffer[3] = n % 256;
20
+ n = Math.floor(n / 256);
21
+ buffer[4] = n;
22
+ return writer.write(buffer);
23
+ }
24
+
25
+ // n <= 0xffffffffffffffff
26
+ const buffer = new Uint8Array(9);
27
+ buffer[0] = 0xff;
28
+ buffer[1] = n % 256;
29
+ n = Math.floor(n / 256);
30
+ buffer[2] = n % 256;
31
+ n = Math.floor(n / 256);
32
+ buffer[3] = n % 256;
33
+ n = Math.floor(n / 256);
34
+ buffer[4] = n % 256;
35
+ n = Math.floor(n / 256);
36
+ buffer[5] = n % 256;
37
+ n = Math.floor(n / 256);
38
+ buffer[6] = n % 256;
39
+ n = Math.floor(n / 256);
40
+ buffer[7] = n % 256;
41
+ n = Math.floor(n / 256);
42
+ buffer[8] = n;
43
+ return writer.write(buffer);
44
+ }
45
+
46
+ export default writeVarint;
@@ -0,0 +1,5 @@
1
+ import Transaction from './transaction.js';
2
+
3
+ export default Transaction;
4
+
5
+
@@ -0,0 +1,33 @@
1
+
2
+ import Input from './input.js';
3
+ import PublicKeyInput from './publickey.js';
4
+ import PublicKeyHashInput from './publickeyhash.js';
5
+ import MultiSigInput from './multisig.js';
6
+
7
+
8
+ /**
9
+ * Attaches the PublicKeyInput class to the Input namespace.
10
+ * @memberof Input
11
+ * @name PublicKey
12
+ * @alias PublicKeyInput
13
+ */
14
+ Input.PublicKey = PublicKeyInput;
15
+
16
+
17
+ /**
18
+ * Attaches the PublicKeyHashInput class to the Input namespace.
19
+ * @memberof Input
20
+ * @name PublicKeyHash
21
+ * @alias PublicKeyHashInput
22
+ */
23
+ Input.PublicKeyHash = PublicKeyHashInput;
24
+ /**
25
+ * Attaches the PublicKeyHashInput class to the Input namespace.
26
+ * @memberof Input
27
+ * @name MultiSig
28
+ * @alias MultiSigInput
29
+ */
30
+ Input.MultiSig = MultiSigInput;
31
+
32
+
33
+ export default Input;
@@ -1,40 +1,34 @@
1
1
  'use strict';
2
2
 
3
- var _ = require('../../util/_');
4
- var $ = require('../../util/preconditions');
5
- var errors = require('../../errors');
6
- var BufferWriter = require('../../encoding/bufferwriter');
7
- var JSUtil = require('../../util/js');
8
- var Script = require('../../script');
9
- var Sighash = require('../sighash');
10
- var Output = require('../output');
11
- var Signature = require('../../crypto/signature');
12
- var TransactionSignature = require('../signature');
13
- var Hash = require('../../crypto/hash');
14
- var Interpreter = require('../../script/interpreter');
15
- var Opcode = require('../../opcode');
16
- const PrivateKey = require('../../privatekey');
3
+ import _ from '../../util/_.js';
4
+ import $ from '../../util/preconditions.js';
5
+ import errors from '../../errors/index.js';
6
+ import BufferWriter from '../../encoding/bufferwriter.js';
7
+ import JSUtil from '../../util/js.js';
8
+ import Script from '../../script/index.js';
9
+ import Sighash from '../sighash.js';
10
+ import Output from '../output.js';
11
+ import Signature from '../../crypto/signature.js';
12
+ import TransactionSignature from '../signature.js';
13
+ import Hash from '../../crypto/hash.js';
14
+ import PrivateKey from '../../privatekey.js';
17
15
 
18
16
  var MAXINT = 0xffffffff; // Math.pow(2, 32) - 1;
19
17
  var DEFAULT_RBF_SEQNUMBER = MAXINT - 2;
20
18
  var DEFAULT_SEQNUMBER = MAXINT;
21
19
  var DEFAULT_LOCKTIME_SEQNUMBER = MAXINT - 1;
22
20
 
23
- function getLowSPreimage(tx, sigtype, inputIndex, subscript, inputAmount) {
24
- var i = 0;
25
- do {
26
- var preimage = Sighash.sighashPreimage(tx, sigtype, inputIndex, subscript, inputAmount);
27
-
28
- var sighash = Hash.sha256sha256(preimage);
29
-
30
- if (_.isPositiveNumber(sighash.readUInt8()) && _.isPositiveNumber(sighash.readUInt8(31))) {
31
- return preimage;
32
- }
33
-
34
- tx.nLockTime++;
35
- } while (i < Number.MAX_SAFE_INTEGER);
36
- }
37
-
21
+ /**
22
+ * Creates an Input instance from parameters.
23
+ * @constructor
24
+ * @param {Object} params - Input parameters object
25
+ * @param {string|Buffer} params.prevTxId - Previous transaction ID (hex string or Buffer)
26
+ * @param {number} params.outputIndex - Output index in previous transaction
27
+ * @param {Output} [params.output] - Output instance or output parameters
28
+ * @param {number} [params.sequenceNumber] - Sequence number (defaults to DEFAULT_SEQNUMBER)
29
+ * @param {Script|Buffer|string} [params.script] - Script instance, buffer or hex string
30
+ * @returns {Input} New Input instance or initialized instance if params provided.
31
+ */
38
32
  function Input(params) {
39
33
  if (!(this instanceof Input)) {
40
34
  return new Input(params);
@@ -51,6 +45,12 @@ Input.DEFAULT_RBF_SEQNUMBER = DEFAULT_RBF_SEQNUMBER;
51
45
  // txid + output index + sequence number
52
46
  Input.BASE_SIZE = 32 + 4 + 4;
53
47
 
48
+ /**
49
+ * Gets or sets the script associated with this input.
50
+ * @memberof Input.prototype
51
+ * @name script
52
+ * @return {Script}
53
+ */
54
54
  Object.defineProperty(Input.prototype, 'script', {
55
55
  configurable: false,
56
56
  enumerable: true,
@@ -66,15 +66,40 @@ Object.defineProperty(Input.prototype, 'script', {
66
66
  },
67
67
  });
68
68
 
69
- Input.fromObject = function (obj) {
70
- $.checkArgument(_.isObject(obj));
69
+ /**
70
+ * Creates an Input instance from a plain JavaScript object.
71
+ * @param {Object} params - Input parameters object
72
+ * @param {string|Buffer} params.prevTxId - Previous transaction ID (hex string or Buffer)
73
+ * @param {number} params.outputIndex - Output index in previous transaction
74
+ * @param {Output} [params.output] - Output instance or output parameters
75
+ * @param {number} [params.sequenceNumber] - Sequence number (defaults to DEFAULT_SEQNUMBER)
76
+ * @param {Script|Buffer|string} [params.script] - Script instance, buffer or hex string
77
+ * @returns {Input} The created Input instance.
78
+ * @throws {Error} Will throw if the argument is not an object.
79
+ */
80
+ Input.fromObject = function (params) {
81
+ $.checkArgument(_.isObject(params));
71
82
  var input = new Input();
72
- return input._fromObject(obj);
83
+ return input._fromObject(params);
73
84
  };
74
85
 
86
+ /**
87
+ * Creates an Input instance from an object containing transaction input parameters.
88
+ * Validates required fields (prevTxId, outputIndex) and converts hex strings to Buffers.
89
+ * Handles optional parameters with defaults (sequenceNumber, script).
90
+ * @param {Object} params - Input parameters object
91
+ * @param {string|Buffer} params.prevTxId - Previous transaction ID (hex string or Buffer)
92
+ * @param {number} params.outputIndex - Output index in previous transaction
93
+ * @param {Output} [params.output] - Output instance or output parameters
94
+ * @param {number} [params.sequenceNumber] - Sequence number (defaults to DEFAULT_SEQNUMBER)
95
+ * @param {Script|Buffer|string} [params.script] - Script instance, buffer or hex string
96
+ * @throws {errors.Transaction.Input.InvalidParams} If required params are missing
97
+ * @returns {Input} Returns the Input instance for chaining
98
+ * @private
99
+ */
75
100
  Input.prototype._fromObject = function (params) {
76
101
 
77
- if(_.isUndefined(params.prevTxId)
102
+ if(_.isUndefined(params.prevTxId)
78
103
  || _.isUndefined(params.outputIndex)) {
79
104
  throw new errors.Transaction.Input.InvalidParams('require prevTxId and outputIndex');
80
105
  }
@@ -100,6 +125,14 @@ Input.prototype._fromObject = function (params) {
100
125
  return this;
101
126
  };
102
127
 
128
+
129
+ /**
130
+ * Converts the Input instance to a plain object for JSON serialization.
131
+ * Includes prevTxId, outputIndex, sequenceNumber, and script as hex strings.
132
+ * Optionally adds human-readable scriptString if script is valid,
133
+ * and includes the output object if present.
134
+ * @returns {Object} A plain object representation of the Input.
135
+ */
103
136
  Input.prototype.toObject = Input.prototype.toJSON = function toObject() {
104
137
  var obj = {
105
138
  prevTxId: this.prevTxId.toString('hex'),
@@ -117,6 +150,17 @@ Input.prototype.toObject = Input.prototype.toJSON = function toObject() {
117
150
  return obj;
118
151
  };
119
152
 
153
+ /**
154
+ * Creates an Input instance from a BufferReader.
155
+ * @param {BufferReader} br - The buffer reader containing input data.
156
+ * @returns {Input} The parsed Input object with properties:
157
+ * - prevTxId: Reversed 32-byte previous transaction ID.
158
+ * - outputIndex: LE uint32 output index.
159
+ * - _scriptBuffer: Var-length script buffer.
160
+ * - sequenceNumber: LE uint32 sequence number.
161
+ * @note TODO: Return specialized input types (CoinbaseInput, PublicKeyHashInput, etc.).
162
+ * @static
163
+ */
120
164
  Input.fromBufferReader = function (br) {
121
165
  var input = new Input();
122
166
  input.prevTxId = br.readReverse(32);
@@ -128,6 +172,12 @@ Input.fromBufferReader = function (br) {
128
172
  return input;
129
173
  };
130
174
 
175
+ /**
176
+ * Serializes the input to a BufferWriter.
177
+ * @param {boolean} hashScriptSig - Whether to hash the script (true) or include it directly (false).
178
+ * @param {BufferWriter} [writer] - Optional BufferWriter instance to write to.
179
+ * @returns {BufferWriter} The BufferWriter containing the serialized input.
180
+ */
131
181
  Input.prototype.toBufferWriter = function (hashScriptSig, writer) {
132
182
  $.checkArgument(typeof hashScriptSig === 'boolean', 'hashScriptSig should be boolean')
133
183
  if (!writer) {
@@ -147,6 +197,10 @@ Input.prototype.toBufferWriter = function (hashScriptSig, writer) {
147
197
  }
148
198
 
149
199
 
200
+ /**
201
+ * Converts the input to a prevout format (txid + output index) as a buffer.
202
+ * @returns {Buffer} The serialized prevout data.
203
+ */
150
204
  Input.prototype.toPrevout = function () {
151
205
  let writer = new BufferWriter()
152
206
  writer.writeReverse(this.prevTxId)
@@ -155,6 +209,12 @@ Input.prototype.toPrevout = function () {
155
209
  }
156
210
 
157
211
 
212
+ /**
213
+ * Sets the script for this input.
214
+ * @param {Script|string|Buffer|null} script - Can be a Script object, hex string, human-readable string, Buffer, or null (for empty script)
215
+ * @returns {Input} Returns the Input instance for chaining
216
+ * @throws {TypeError} If script is of invalid type
217
+ */
158
218
  Input.prototype.setScript = function (script) {
159
219
  this._script = null;
160
220
  if (script instanceof Script) {
@@ -189,7 +249,6 @@ Input.prototype.setScript = function (script) {
189
249
  * @param {PrivateKey | Array} privateKeys - the private key to use when signing
190
250
  * @param {number} inputIndex - the index of this input in the provided transaction
191
251
  * @param {number} sigType - defaults to Signature.SIGHASH_ALL
192
- * @abstract
193
252
  */
194
253
  Input.prototype.getSignatures = function (transaction, privateKeys, inputIndex, sigtype) {
195
254
  $.checkState(this.output instanceof Output);
@@ -246,37 +305,62 @@ Input.prototype.getSignatures = function (transaction, privateKeys, inputIndex,
246
305
  * @param {number} inputIndex - the index of this input in the provided transaction
247
306
  * @param {number} sigType - defaults to Signature.SIGHASH_ALL
248
307
  * @param {boolean} isLowS - true if the sig hash is safe for low s.
249
- * @abstract
250
308
  */
251
309
  Input.prototype.getPreimage = function (transaction, inputIndex, sigtype, isLowS) {
252
310
  $.checkState(this.output instanceof Output);
253
311
  sigtype = sigtype || Signature.SIGHASH_ALL;
254
312
  isLowS = isLowS || false;
255
313
  return isLowS
256
- ? getLowSPreimage(transaction, sigtype, inputIndex)
314
+ ? Sighash.getLowSSighashPreimage(transaction, sigtype, inputIndex)
257
315
  : Sighash.sighashPreimage(transaction, sigtype, inputIndex);
258
316
  };
259
317
 
318
+ /**
319
+ * Abstract method that throws an error when invoked. Must be implemented by subclasses
320
+ * to determine if all required signatures are present on this input.
321
+ * @throws {AbstractMethodInvoked} Always throws to indicate abstract method usage
322
+ * @abstract
323
+ */
260
324
  Input.prototype.isFullySigned = function () {
261
325
  throw new errors.AbstractMethodInvoked('Input#isFullySigned');
262
326
  };
263
327
 
328
+ /**
329
+ * Checks if the input is final (has maximum sequence number).
330
+ * @returns {boolean} True if the input is final, false otherwise.
331
+ */
264
332
  Input.prototype.isFinal = function () {
265
333
  return this.sequenceNumber === Input.MAXINT;
266
334
  };
267
335
 
268
- Input.prototype.addSignature = function (transaction, signature) {
269
- const s = Script.buildPublicKeyIn(signature.signature.toDER(), signature.sigtype)
270
- console.log("s:", s.toHex())
271
- // throw new errors.AbstractMethodInvoked('Input#addSignature')
336
+ /**
337
+ * Abstract method to add a signature to the transaction input.
338
+ * Must be implemented by concrete input types.
339
+ * @param {Object} transaction - The transaction to sign
340
+ * @param {Object} signature - The signature to add
341
+ * @abstract
342
+ */
343
+ Input.prototype.addSignature = function (_transaction, _signature) {
272
344
  };
273
345
 
346
+ /**
347
+ * Clears all signatures from the input.
348
+ * @abstract
349
+ */
274
350
  Input.prototype.clearSignatures = function () {
275
- // throw new errors.AbstractMethodInvoked('Input#clearSignatures')
351
+
276
352
  };
277
353
 
354
+ /**
355
+ * Verifies if a signature is valid for this input in the given transaction.
356
+ * Note: Temporarily modifies the signature object by setting nhashtype from sigtype.
357
+ *
358
+ * @param {Object} transaction - The transaction to verify against
359
+ * @param {TransactionSignature} signature - Signature object containing signature, publicKey, etc.
360
+ * @returns {boolean} True if the signature is valid, false otherwise
361
+ */
278
362
  Input.prototype.isValidSignature = function (transaction, signature) {
279
- // FIXME: Refactor signature so this is not necessary
363
+ // FIXME: Refactor signature so this is not necessary
280
364
  signature.signature.nhashtype = signature.sigtype;
281
365
  return Sighash.verify(
282
366
  transaction,
@@ -299,56 +383,14 @@ Input.prototype.isNull = function () {
299
383
  );
300
384
  };
301
385
 
386
+ /**
387
+ * Estimates the size of the input in bytes by converting it to a buffer.
388
+ * @returns {number} The length of the serialized buffer in bytes.
389
+ * @private
390
+ */
302
391
  Input.prototype._estimateSize = function () {
303
392
  return this.toBufferWriter(false).toBuffer().length;
304
393
  };
305
394
 
306
- Input.prototype.verify = function (transaction, inputIndex) {
307
- $.checkState(this.output instanceof Output);
308
- $.checkState(this.script instanceof Script);
309
- $.checkState(this.output.script instanceof Script);
310
-
311
- var us = this.script;
312
- var ls = this.output.script;
313
- var inputSatoshis = this.output.satoshisBN;
314
-
315
- Interpreter.MAX_SCRIPT_ELEMENT_SIZE = Number.MAX_SAFE_INTEGER;
316
- Interpreter.MAXIMUM_ELEMENT_SIZE = Number.MAX_SAFE_INTEGER;
317
-
318
- const bsi = new Interpreter();
319
-
320
- let failedAt = {};
321
-
322
- bsi.stepListener = function (step) {
323
- if (
324
- step.fExec ||
325
- (Opcode.OP_IF <= step.opcode.toNumber() && step.opcode.toNumber() <= Opcode.OP_ENDIF)
326
- ) {
327
- if (
328
- (Opcode.OP_IF <= step.opcode.toNumber() && step.opcode.toNumber() <= Opcode.OP_ENDIF) ||
329
- step.opcode.toNumber() === Opcode.OP_RETURN
330
- ) {
331
- /** Opreturn */ failedAt.opcode = step.opcode;
332
- } else {
333
- failedAt = step;
334
- }
335
- }
336
- };
337
-
338
- var success = bsi.verify(
339
- us,
340
- ls,
341
- transaction,
342
- inputIndex,
343
- Interpreter.DEFAULT_FLAGS,
344
- inputSatoshis,
345
- );
346
-
347
- if (failedAt.opcode) {
348
- failedAt.opcode = failedAt.opcode.toNumber();
349
- }
350
-
351
- return { success, error: bsi.errstr, failedAt: success ? {} : failedAt };
352
- };
353
395
 
354
- module.exports = Input;
396
+ export default Input;