@opcat-labs/opcat 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/.cjs2esm.json +18 -0
  2. package/.mocharc.yaml +1 -1
  3. package/CHANGELOG.md +13 -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 +40 -26
  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
@@ -1,11 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var BN = require('./bn');
4
- var _ = require('../util/_');
5
- var $ = require('../util/preconditions');
6
- var JSUtil = require('../util/js');
3
+ var BN = require('./bn.cjs');
4
+ var _ = require('../util/_.cjs');
5
+ var $ = require('../util/preconditions.cjs');
6
+ var JSUtil = require('../util/js.cjs');
7
7
 
8
- var Signature = function Signature(r, s) {
8
+ /**
9
+ * Creates a new Signature instance from BN values or an object.
10
+ * @constructor
11
+ * @param {BN|Object} r - Either a BN instance for the r value or an object containing r and s properties.
12
+ * @param {BN} [s] - The s value (required if r is a BN instance).
13
+ */
14
+ function Signature(r, s) {
9
15
  if (!(this instanceof Signature)) {
10
16
  return new Signature(r, s);
11
17
  }
@@ -20,6 +26,16 @@ var Signature = function Signature(r, s) {
20
26
  }
21
27
  };
22
28
 
29
+ /**
30
+ * Sets signature properties from an object.
31
+ * @param {Object} obj - Object containing signature properties
32
+ * @param {Buffer} [obj.r] - r value
33
+ * @param {Buffer} [obj.s] - s value
34
+ * @param {number} [obj.i] - Public key recovery parameter (0-3)
35
+ * @param {boolean} [obj.compressed] - Whether recovered pubkey is compressed
36
+ * @param {number} [obj.nhashtype] - Hash type
37
+ * @returns {Signature} Returns the signature instance for chaining
38
+ */
23
39
  Signature.prototype.set = function (obj) {
24
40
  this.r = obj.r || this.r || undefined;
25
41
  this.s = obj.s || this.s || undefined;
@@ -30,6 +46,13 @@ Signature.prototype.set = function (obj) {
30
46
  return this;
31
47
  };
32
48
 
49
+ /**
50
+ * Creates a Signature instance from a compact ECDSA signature buffer.
51
+ * @param {Buffer} buf - The compact signature buffer (65 bytes).
52
+ * @returns {Signature} The parsed signature object.
53
+ * @throws {Error} If the input is invalid (not a Buffer, wrong length, or invalid recovery param).
54
+ * @static
55
+ */
33
56
  Signature.fromCompact = function (buf) {
34
57
  $.checkArgument(Buffer.isBuffer(buf), 'Argument is expected to be a Buffer');
35
58
 
@@ -57,6 +80,13 @@ Signature.fromCompact = function (buf) {
57
80
  return sig;
58
81
  };
59
82
 
83
+ /**
84
+ * Creates a Signature instance from a DER-encoded or raw buffer.
85
+ * @param {Buffer} buf - The input buffer containing DER-encoded or raw signature data
86
+ * @param {boolean} [strict] - Whether to enforce strict DER parsing rules
87
+ * @returns {Signature} A new Signature instance with parsed r and s values
88
+ * @static
89
+ */
60
90
  Signature.fromDER = Signature.fromBuffer = function (buf, strict) {
61
91
  var obj = Signature.parseDER(buf, strict);
62
92
  var sig = new Signature();
@@ -68,6 +98,12 @@ Signature.fromDER = Signature.fromBuffer = function (buf, strict) {
68
98
  };
69
99
 
70
100
  // The format used in a tx
101
+ /**
102
+ * Converts a transaction-format signature buffer to a Signature object.
103
+ * @param {Buffer} buf - The signature buffer in transaction format (DER + hash type byte)
104
+ * @returns {Signature} The parsed Signature object with nhashtype property set
105
+ * @static
106
+ */
71
107
  Signature.fromTxFormat = function (buf) {
72
108
  var nhashtype = buf.readUInt8(buf.length - 1);
73
109
  var derbuf = buf.slice(0, buf.length - 1);
@@ -76,13 +112,38 @@ Signature.fromTxFormat = function (buf) {
76
112
  return sig;
77
113
  };
78
114
 
115
+ /**
116
+ * Creates a Signature instance from a hex-encoded string.
117
+ * @param {string} str - Hex-encoded signature string
118
+ * @returns {Signature} Signature instance parsed from DER format
119
+ * @static
120
+ */
79
121
  Signature.fromString = function (str) {
80
122
  var buf = Buffer.from(str, 'hex');
81
123
  return Signature.fromDER(buf);
82
124
  };
83
125
 
126
+
84
127
  /**
128
+ * Parses a DER formatted signature buffer into its components.
85
129
  * In order to mimic the non-strict DER encoding of OpenSSL, set strict = false.
130
+ * @param {Buffer} buf - The DER formatted signature buffer to parse
131
+ * @param {boolean} [strict=true] - Whether to perform strict length validation
132
+ * @returns {Object} An object containing the parsed signature components:
133
+ * - header: The DER header byte (0x30)
134
+ * - length: The total length of the signature components
135
+ * - rheader: The R component header byte (0x02)
136
+ * - rlength: The length of the R component
137
+ * - rneg: Whether R is negative
138
+ * - rbuf: The R component buffer
139
+ * - r: The R component as a BN
140
+ * - sheader: The S component header byte (0x02)
141
+ * - slength: The length of the S component
142
+ * - sneg: Whether S is negative
143
+ * - sbuf: The S component buffer
144
+ * - s: The S component as a BN
145
+ * @throws {Error} If the buffer is not valid DER format or length checks fail
146
+ * @static
86
147
  */
87
148
  Signature.parseDER = function (buf, strict) {
88
149
  $.checkArgument(Buffer.isBuffer(buf), new Error('DER formatted signature should be a buffer'));
@@ -141,6 +202,13 @@ Signature.parseDER = function (buf, strict) {
141
202
  return obj;
142
203
  };
143
204
 
205
+ /**
206
+ * Converts the signature to a compact format.
207
+ * @param {number} [i] - The recovery ID (0, 1, 2, or 3). Defaults to the instance's `i` value.
208
+ * @param {boolean} [compressed] - Whether the signature is compressed. Defaults to the instance's `compressed` value.
209
+ * @returns {Buffer} - The compact signature as a Buffer (1 byte recovery ID + 32 bytes r + 32 bytes s).
210
+ * @throws {Error} - If `i` is not 0, 1, 2, or 3.
211
+ */
144
212
  Signature.prototype.toCompact = function (i, compressed) {
145
213
  i = typeof i === 'number' ? i : this.i;
146
214
  compressed = typeof compressed === 'boolean' ? compressed : this.compressed;
@@ -163,6 +231,12 @@ Signature.prototype.toCompact = function (i, compressed) {
163
231
  return Buffer.concat([b1, b2, b3]);
164
232
  };
165
233
 
234
+ /**
235
+ * Converts the signature to DER format.
236
+ * Handles negative values by prepending a zero byte if necessary.
237
+ *
238
+ * @returns {Buffer} The DER-encoded signature.
239
+ */
166
240
  Signature.prototype.toBuffer = Signature.prototype.toDER = function () {
167
241
  var rnbuf = this.r.toBuffer();
168
242
  var snbuf = this.s.toBuffer();
@@ -189,6 +263,10 @@ Signature.prototype.toBuffer = Signature.prototype.toDER = function () {
189
263
  return der;
190
264
  };
191
265
 
266
+ /**
267
+ * Converts the signature to a hexadecimal string representation.
268
+ * @returns {string} The DER-encoded signature in hexadecimal format.
269
+ */
192
270
  Signature.prototype.toString = function () {
193
271
  var buf = this.toDER();
194
272
  return buf.toString('hex');
@@ -205,6 +283,10 @@ Signature.prototype.toString = function () {
205
283
  * in which case a single 0 byte is necessary and even required).
206
284
  *
207
285
  * See https://bitcointalk.org/index.php?topic=8392.msg127623#msg127623
286
+ *
287
+ * @param {Buffer} buf - The buffer containing the signature to verify
288
+ * @returns {boolean} True if the signature is valid DER-encoded, false otherwise
289
+ * @static
208
290
  */
209
291
  Signature.isTxDER = function (buf) {
210
292
  if (buf.length < 9) {
@@ -272,10 +354,12 @@ Signature.isTxDER = function (buf) {
272
354
  return true;
273
355
  };
274
356
 
357
+
275
358
  /**
276
- * Compares to bitcoind's IsLowDERSignature
359
+ * Checks if the signature's S value is within the valid range (low-S).
277
360
  * See also ECDSA signature algorithm which enforces this.
278
361
  * See also BIP 62, "low S values in signatures"
362
+ * @returns {boolean} True if S is between 1 and the upper bound (0x7F...A0), false otherwise.
279
363
  */
280
364
  Signature.prototype.hasLowS = function () {
281
365
  if (
@@ -287,9 +371,13 @@ Signature.prototype.hasLowS = function () {
287
371
  return true;
288
372
  };
289
373
 
374
+
290
375
  /**
291
- * @returns true if the nhashtype is exactly equal to one of the standard options or combinations thereof.
292
- * Translated from bitcoind's IsDefinedHashtypeSignature
376
+ * Checks if the signature has a defined hashtype.
377
+ * - Validates that nhashtype is a natural number
378
+ * - Accepts with or without Signature.SIGHASH_ANYONECANPAY by ignoring the bit
379
+ * - Verifies the hashtype is between SIGHASH_ALL and SIGHASH_SINGLE
380
+ * @returns {boolean} True if the hashtype is valid, false otherwise
293
381
  */
294
382
  Signature.prototype.hasDefinedHashtype = function () {
295
383
  if (!JSUtil.isNaturalNumber(this.nhashtype)) {
@@ -303,6 +391,11 @@ Signature.prototype.hasDefinedHashtype = function () {
303
391
  return true;
304
392
  };
305
393
 
394
+ /**
395
+ * Converts the signature to transaction format by concatenating the DER-encoded signature
396
+ * with the hash type byte.
397
+ * @returns {Buffer} The signature in transaction format (DER + hash type byte).
398
+ */
306
399
  Signature.prototype.toTxFormat = function () {
307
400
  var derbuf = this.toDER();
308
401
  var buf = Buffer.alloc(1);
@@ -310,16 +403,73 @@ Signature.prototype.toTxFormat = function () {
310
403
  return Buffer.concat([derbuf, buf]);
311
404
  };
312
405
 
406
+ /**
407
+ * Signature hash type for signing all inputs/outputs (default).
408
+ * @constant {number}
409
+ * @default 0x01
410
+ */
313
411
  Signature.SIGHASH_ALL = 0x01;
412
+ /**
413
+ * Flag indicating that no outputs are signed (only inputs are signed).
414
+ * Used in signature hashing to specify which parts of the transaction are included in the hash.
415
+ * @constant {number}
416
+ * @default 0x02
417
+ */
314
418
  Signature.SIGHASH_NONE = 0x02;
419
+ /**
420
+ * Signature hash type for single input signing (0x03).
421
+ * @constant {number}
422
+ * @default 0x03
423
+ */
315
424
  Signature.SIGHASH_SINGLE = 0x03;
425
+ /**
426
+ * Bit flag indicating that only the current input is signed (others can be modified).
427
+ * Used in Bitcoin signature hashing (SIGHASH type).
428
+ * @constant {number}
429
+ * @default 0x80
430
+ */
316
431
  Signature.SIGHASH_ANYONECANPAY = 0x80;
317
432
 
433
+ /**
434
+ * Signature hash type for signing all inputs/outputs (default).
435
+ * @constant {number}
436
+ * @default 0x01
437
+ */
318
438
  Signature.ALL = Signature.SIGHASH_ALL
439
+ /**
440
+ * Flag indicating that no outputs are signed (only inputs are signed).
441
+ * Used in signature hashing to specify which parts of the transaction are included in the hash.
442
+ * @constant {number}
443
+ * @default 0x02
444
+ */
319
445
  Signature.NONE = Signature.SIGHASH_NONE
446
+ /**
447
+ * Signature hash type for single input signing (0x03).
448
+ * @constant {number}
449
+ * @default 0x03
450
+ */
320
451
  Signature.SINGLE = Signature.SIGHASH_SINGLE
452
+ /**
453
+ * Bitwise flag combination for signature hash types:
454
+ * SIGHASH_ALL (default) with ANYONECANPAY modifier.
455
+ * Allows anyone to add inputs to the transaction.
456
+ * @constant {number}
457
+ * @default 0x81
458
+ */
321
459
  Signature.ANYONECANPAY_ALL = Signature.SIGHASH_ALL | Signature.SIGHASH_ANYONECANPAY
460
+ /**
461
+ * Bitwise flag combination for a signature that allows anyone to pay (no output locking)
462
+ * and doesn't commit to any outputs (SIGHASH_NONE).
463
+ * @constant {number}
464
+ * @default 0x82
465
+ */
322
466
  Signature.ANYONECANPAY_NONE = Signature.SIGHASH_NONE | Signature.SIGHASH_ANYONECANPAY
467
+ /**
468
+ * Bitwise flag combination for signature allowing anyone to pay (SIGHASH_ANYONECANPAY)
469
+ * with single output mode (SIGHASH_SINGLE).
470
+ * @constant {number}
471
+ * @default 0x83
472
+ */
323
473
  Signature.ANYONECANPAY_SINGLE = Signature.SIGHASH_SINGLE | Signature.SIGHASH_ANYONECANPAY
324
474
 
325
475
  module.exports = Signature;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var _ = require('../util/_');
3
+ var _ = require('../util/_.cjs');
4
4
  var bs58 = require('bs58');
5
5
 
6
6
  /**
@@ -18,7 +18,7 @@ var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'.spli
18
18
  *
19
19
  * @param {object} obj Can be a string or buffer.
20
20
  */
21
- var Base58 = function Base58(obj) {
21
+ function Base58(obj) {
22
22
  if (!(this instanceof Base58)) {
23
23
  return new Base58(obj);
24
24
  }
@@ -31,6 +31,12 @@ var Base58 = function Base58(obj) {
31
31
  }
32
32
  };
33
33
 
34
+ /**
35
+ * Checks if all characters in the input are valid Base58 characters.
36
+ * @param {string|Buffer} chars - The input characters to validate (can be a string or Buffer).
37
+ * @returns {boolean} True if all characters are valid Base58, false otherwise.
38
+ * @static
39
+ */
34
40
  Base58.validCharacters = function validCharacters(chars) {
35
41
  if (Buffer.isBuffer(chars)) {
36
42
  chars = chars.toString();
@@ -42,6 +48,12 @@ Base58.validCharacters = function validCharacters(chars) {
42
48
  );
43
49
  };
44
50
 
51
+ /**
52
+ * Sets the buffer property from the given object.
53
+ * @param {Object} obj - The object containing the buffer to set.
54
+ * @param {Buffer} [obj.buf] - The buffer to assign. If not provided, retains current buffer or sets to undefined.
55
+ * @returns {Base58} Returns the instance for chaining.
56
+ */
45
57
  Base58.prototype.set = function (obj) {
46
58
  this.buf = obj.buf || this.buf || undefined;
47
59
  return this;
@@ -52,6 +64,8 @@ Base58.prototype.set = function (obj) {
52
64
  *
53
65
  * @param {Buffer} buf Any buffer to be encoded.
54
66
  * @returns {string} A Base 58 encoded string.
67
+ * @throws {Error} If the input is not a buffer.
68
+ * @static
55
69
  */
56
70
  Base58.encode = function (buf) {
57
71
  if (!Buffer.isBuffer(buf)) {
@@ -65,6 +79,8 @@ Base58.encode = function (buf) {
65
79
  *
66
80
  * @param {string} str A Base 58 encoded string.
67
81
  * @returns {Buffer} The decoded buffer.
82
+ * @throws {Error} If the input is not a string.
83
+ * @static
68
84
  */
69
85
  Base58.decode = function (str) {
70
86
  if (typeof str !== 'string') {
@@ -73,37 +89,77 @@ Base58.decode = function (str) {
73
89
  return Buffer.from(bs58.decode(str));
74
90
  };
75
91
 
92
+ /**
93
+ * Sets the internal buffer to the provided buffer and returns the instance for chaining.
94
+ * @param {Buffer} buf - The buffer to set as the internal buffer.
95
+ * @returns {Base58} The instance for method chaining.
96
+ */
76
97
  Base58.prototype.fromBuffer = function (buf) {
77
98
  this.buf = buf;
78
99
  return this;
79
100
  };
80
101
 
102
+ /**
103
+ * Creates a Base58 encoded string from a buffer.
104
+ * @param {Buffer} buf - The input buffer to encode.
105
+ * @returns {Base58} A new Base58 instance containing the encoded string.
106
+ * @static
107
+ */
81
108
  Base58.fromBuffer = function (buf) {
82
109
  return new Base58().fromBuffer(buf);
83
110
  };
84
111
 
112
+ /**
113
+ * Converts a hex string to Base58 encoded string.
114
+ * @param {string} hex - The hex string to convert.
115
+ * @returns {string} The Base58 encoded string.
116
+ * @static
117
+ */
85
118
  Base58.fromHex = function (hex) {
86
119
  return Base58.fromBuffer(Buffer.from(hex, 'hex'));
87
120
  };
88
121
 
122
+ /**
123
+ * Converts a Base58 encoded string to a buffer and stores it in the instance.
124
+ * @param {string} str - The Base58 encoded string to decode.
125
+ * @returns {Base58} The current instance for chaining.
126
+ */
89
127
  Base58.prototype.fromString = function (str) {
90
128
  var buf = Base58.decode(str);
91
129
  this.buf = buf;
92
130
  return this;
93
131
  };
94
132
 
133
+ /**
134
+ * Creates a Base58 instance from a string input.
135
+ * @param {string} str - The string to convert to Base58.
136
+ * @returns {Base58} A new Base58 instance containing the encoded string.
137
+ * @static
138
+ */
95
139
  Base58.fromString = function (str) {
96
140
  return new Base58().fromString(str);
97
141
  };
98
142
 
143
+ /**
144
+ * Returns the internal buffer containing the Base58 encoded data.
145
+ * @returns {Buffer} The raw buffer representation of the Base58 data.
146
+ */
99
147
  Base58.prototype.toBuffer = function () {
100
148
  return this.buf;
101
149
  };
102
150
 
151
+ /**
152
+ * Converts the Base58 encoded data to a hexadecimal string.
153
+ * @returns {string} Hexadecimal representation of the Base58 data.
154
+ */
103
155
  Base58.prototype.toHex = function () {
104
156
  return this.toBuffer().toString('hex');
105
157
  };
106
158
 
159
+ /**
160
+ * Converts the Base58 instance to its string representation.
161
+ * @returns {string} The Base58 encoded string.
162
+ */
107
163
  Base58.prototype.toString = function () {
108
164
  return Base58.encode(this.buf);
109
165
  };
@@ -0,0 +1,192 @@
1
+ 'use strict';
2
+
3
+ var _ = require('../util/_.cjs');
4
+ var Base58 = require('./base58.cjs');
5
+ var Hash = require('../crypto/hash.cjs');
6
+
7
+ /**
8
+ * A Base58check object can encode/decodd Base 58, which is used primarily for
9
+ * string-formatted Bitcoin addresses and private keys. This is the same as
10
+ * Base58, except that it includes a checksum to prevent accidental mistypings.
11
+ * @constructor
12
+ * @param {Buffer|string} obj Can be a string or buffer.
13
+ */
14
+ function Base58Check(obj) {
15
+ if (!(this instanceof Base58Check)) {
16
+ return new Base58Check(obj);
17
+ }
18
+ if (Buffer.isBuffer(obj)) {
19
+ var buf = obj;
20
+ this.fromBuffer(buf);
21
+ } else if (typeof obj === 'string') {
22
+ var str = obj;
23
+ this.fromString(str);
24
+ }
25
+ };
26
+
27
+ /**
28
+ * Sets the buffer property from the given object.
29
+ * @param {Object} obj - The object containing the buffer to set.
30
+ * @returns {Base58Check} Returns the instance for chaining.
31
+ */
32
+ Base58Check.prototype.set = function (obj) {
33
+ this.buf = obj.buf || this.buf || undefined;
34
+ return this;
35
+ };
36
+
37
+ /**
38
+ * Validates the checksum of Base58Check encoded data.
39
+ * @param {Buffer|string} data - The data to validate, either as a Buffer or Base58 encoded string.
40
+ * @param {Buffer|string} [checksum] - Optional checksum to validate against, either as a Buffer or Base58 encoded string.
41
+ * If not provided, the last 4 bytes of the data will be used as checksum.
42
+ * @returns {boolean} True if the computed checksum matches the provided/embedded checksum.
43
+ * @static
44
+ */
45
+ Base58Check.validChecksum = function validChecksum(data, checksum) {
46
+ if (_.isString(data)) {
47
+ data = Buffer.from(Base58.decode(data));
48
+ }
49
+ if (_.isString(checksum)) {
50
+ checksum = Buffer.from(Base58.decode(checksum));
51
+ }
52
+ if (!checksum) {
53
+ checksum = data.slice(-4);
54
+ data = data.slice(0, -4);
55
+ }
56
+ return Base58Check.checksum(data).toString('hex') === checksum.toString('hex');
57
+ };
58
+
59
+ /**
60
+ * Decodes a Base58Check encoded string and verifies its checksum.
61
+ * @param {string} s - The Base58Check encoded string to decode.
62
+ * @returns {Buffer} The decoded data (excluding checksum).
63
+ * @throws {Error} If input is not a string, too short, or checksum mismatch.
64
+ * @static
65
+ */
66
+ Base58Check.decode = function (s) {
67
+ if (typeof s !== 'string') {
68
+ throw new Error('Input must be a string');
69
+ }
70
+
71
+ var buf = Buffer.from(Base58.decode(s));
72
+
73
+ if (buf.length < 4) {
74
+ throw new Error('Input string too short');
75
+ }
76
+
77
+ var data = buf.slice(0, -4);
78
+ var csum = buf.slice(-4);
79
+
80
+ var hash = Hash.sha256sha256(data);
81
+ var hash4 = hash.slice(0, 4);
82
+
83
+ if (csum.toString('hex') !== hash4.toString('hex')) {
84
+ throw new Error('Checksum mismatch');
85
+ }
86
+
87
+ return data;
88
+ };
89
+
90
+ /**
91
+ * Calculates the checksum for a given buffer using double SHA-256 hash.
92
+ * The checksum is the first 4 bytes of the double-hashed result.
93
+ * @param {Buffer} buffer - The input buffer to calculate checksum for
94
+ * @returns {Buffer} The 4-byte checksum
95
+ * @static
96
+ */
97
+ Base58Check.checksum = function (buffer) {
98
+ return Hash.sha256sha256(buffer).slice(0, 4);
99
+ };
100
+
101
+ /**
102
+ * Encodes a buffer into Base58Check format.
103
+ * @param {Buffer} buf - The input buffer to encode
104
+ * @returns {string} The Base58Check encoded string
105
+ * @throws {Error} If input is not a Buffer
106
+ * @static
107
+ */
108
+ Base58Check.encode = function (buf) {
109
+ if (!Buffer.isBuffer(buf)) {
110
+ throw new Error('Input must be a buffer');
111
+ }
112
+ var checkedBuf = Buffer.alloc(buf.length + 4);
113
+ var hash = Base58Check.checksum(buf);
114
+ buf.copy(checkedBuf);
115
+ hash.copy(checkedBuf, buf.length);
116
+ return Base58.encode(checkedBuf);
117
+ };
118
+
119
+ /**
120
+ * Sets the internal buffer to the provided Buffer object.
121
+ * @param {Buffer} buf - The buffer to set as the internal state.
122
+ * @returns {Base58Check} Returns the instance for chaining.
123
+ */
124
+ Base58Check.prototype.fromBuffer = function (buf) {
125
+ this.buf = buf;
126
+ return this;
127
+ };
128
+
129
+ /**
130
+ * Creates a Base58Check encoded string from a buffer.
131
+ * @param {Buffer} buf - The input buffer to encode.
132
+ * @returns {Base58Check} A new Base58Check instance containing the encoded data.
133
+ */
134
+ Base58Check.fromBuffer = function (buf) {
135
+ return new Base58Check().fromBuffer(buf);
136
+ };
137
+
138
+ /**
139
+ * Converts a hex string to a Base58Check encoded string.
140
+ * @param {string} hex - The hex string to convert.
141
+ * @returns {string} The Base58Check encoded string.
142
+ */
143
+ Base58Check.fromHex = function (hex) {
144
+ return Base58Check.fromBuffer(Buffer.from(hex, 'hex'));
145
+ };
146
+
147
+ /**
148
+ * Converts a Base58Check encoded string to a buffer and stores it in the instance.
149
+ * @param {string} str - The Base58Check encoded string to decode.
150
+ * @returns {Base58Check} Returns the instance for chaining.
151
+ */
152
+ Base58Check.prototype.fromString = function (str) {
153
+ var buf = Base58Check.decode(str);
154
+ this.buf = buf;
155
+ return this;
156
+ };
157
+
158
+ /**
159
+ * Converts a Base58Check-encoded string into a Base58 object.
160
+ * @param {string} str - The Base58Check-encoded string to decode.
161
+ * @returns {Base58} A new Base58 instance containing the decoded data.
162
+ */
163
+ Base58Check.fromString = function (str) {
164
+ var buf = Base58Check.decode(str);
165
+ return new Base58(buf);
166
+ };
167
+
168
+ /**
169
+ * Returns the internal buffer containing the Base58Check encoded data.
170
+ * @returns {Buffer} The raw buffer representation of the Base58Check data.
171
+ */
172
+ Base58Check.prototype.toBuffer = function () {
173
+ return this.buf;
174
+ };
175
+
176
+ /**
177
+ * Converts the Base58Check encoded data to a hexadecimal string.
178
+ * @returns {string} Hexadecimal representation of the data.
179
+ */
180
+ Base58Check.prototype.toHex = function () {
181
+ return this.toBuffer().toString('hex');
182
+ };
183
+
184
+ /**
185
+ * Converts the Base58Check instance to its string representation.
186
+ * @returns {string} The Base58Check encoded string.
187
+ */
188
+ Base58Check.prototype.toString = function () {
189
+ return Base58Check.encode(this.buf);
190
+ };
191
+
192
+ module.exports = Base58Check;