@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
@@ -0,0 +1,278 @@
1
+ 'use strict';
2
+
3
+ import BN from '../bn.js';
4
+ import $ from '../util/preconditions.js';
5
+ import _ from '../util/_.js';
6
+
7
+ var reversebuf = function (buf) {
8
+ var buf2 = Buffer.alloc(buf.length);
9
+ for (var i = 0; i < buf.length; i++) {
10
+ buf2[i] = buf[buf.length - 1 - i];
11
+ }
12
+ return buf2;
13
+ };
14
+
15
+ BN.Zero = new BN(0);
16
+ BN.One = new BN(1);
17
+ BN.Minus1 = new BN(-1);
18
+
19
+ /**
20
+ * Convert a number into a big number.
21
+ *
22
+ * @param {number} n Any positive or negative integer.
23
+ */
24
+ BN.fromNumber = function (n) {
25
+ $.checkArgument(_.isNumber(n));
26
+ return BN.fromString(n.toString(16), 16)
27
+ };
28
+
29
+ /**
30
+ * Convert a string number into a big number.
31
+ *
32
+ * @param {string} str Any positive or negative integer formatted as a string.
33
+ * @param {number} base The base of the number, defaults to 10.
34
+ */
35
+ BN.fromString = function (str, base) {
36
+ $.checkArgument(_.isString(str));
37
+ return new BN(str, base);
38
+ };
39
+
40
+ /**
41
+ * Convert a buffer (such as a 256 bit binary private key) into a big number.
42
+ * Sometimes these numbers can be formatted either as 'big endian' or 'little
43
+ * endian', and so there is an opts parameter that lets you specify which
44
+ * endianness is specified.
45
+ *
46
+ * @param {Buffer} buf A buffer number, such as a 256 bit hash or key.
47
+ * @param {Object} opts With a property 'endian' that can be either 'big' or 'little'. Defaults big endian (most significant digit first).
48
+ */
49
+ BN.fromBuffer = function (buf, opts) {
50
+ if (typeof opts !== 'undefined' && opts.endian === 'little') {
51
+ buf = reversebuf(buf);
52
+ }
53
+ var hex = buf.toString('hex');
54
+ var bn = new BN(hex, 16);
55
+ return bn;
56
+ };
57
+
58
+ /**
59
+ * Instantiate a BigNumber from a "signed magnitude buffer". (a buffer where the
60
+ * most significant bit represents the sign (0 = positive, 1 = negative)
61
+ *
62
+ * @param {Buffer} buf A buffer number, such as a 256 bit hash or key.
63
+ * @param {Object} opts With a property 'endian' that can be either 'big' or 'little'. Defaults big endian (most significant digit first).
64
+ */
65
+ BN.fromSM = function (buf, opts) {
66
+ var ret;
67
+ if (buf.length === 0) {
68
+ return BN.fromBuffer(Buffer.from([0]));
69
+ }
70
+
71
+ var endian = 'big';
72
+ if (opts) {
73
+ endian = opts.endian;
74
+ }
75
+ if (endian === 'little') {
76
+ buf = reversebuf(buf);
77
+ }
78
+
79
+ if (buf[0] & 0x80) {
80
+ buf[0] = buf[0] & 0x7f;
81
+ ret = BN.fromBuffer(buf);
82
+ ret.neg().copy(ret);
83
+ } else {
84
+ ret = BN.fromBuffer(buf);
85
+ }
86
+ return ret;
87
+ };
88
+
89
+ /**
90
+ * Convert a big number into a number.
91
+ */
92
+ BN.prototype.toNumber = function () {
93
+ return parseInt(this.toString(10), 10);
94
+ };
95
+
96
+ /**
97
+ * Convert a big number into a buffer. This is somewhat ambiguous, so there is
98
+ * an opts parameter that let's you specify the endianness or the size.
99
+ * opts.endian can be either 'big' or 'little' and opts.size can be any
100
+ * sufficiently large number of bytes. If you always want to create a 32 byte
101
+ * big endian number, then specify opts = { endian: 'big', size: 32 }
102
+ *
103
+ * @param {Object} opts Defaults to { endian: 'big', size: 32 }
104
+ */
105
+ BN.prototype.toBuffer = function (opts) {
106
+ var buf, hex;
107
+ if (opts && opts.size) {
108
+ hex = this.toString(16, 2);
109
+ var natlen = hex.length / 2;
110
+ buf = Buffer.from(hex, 'hex');
111
+
112
+ if (natlen === opts.size) {
113
+ // buf = buf
114
+ } else if (natlen > opts.size) {
115
+ buf = BN.trim(buf, natlen);
116
+ } else if (natlen < opts.size) {
117
+ buf = BN.pad(buf, natlen, opts.size);
118
+ }
119
+ } else {
120
+ hex = this.toString(16, 2);
121
+ buf = Buffer.from(hex, 'hex');
122
+ }
123
+
124
+ if (typeof opts !== 'undefined' && opts.endian === 'little') {
125
+ buf = reversebuf(buf);
126
+ }
127
+
128
+ return buf;
129
+ };
130
+
131
+ /**
132
+ * For big numbers that are either positive or negative, you can convert to
133
+ * "sign magnitude" format whereby the first bit specifies whether the number is
134
+ * positive or negative.
135
+ */
136
+ BN.prototype.toSMBigEndian = function () {
137
+ var buf;
138
+ if (this.cmp(BN.Zero) === -1) {
139
+ buf = this.neg().toBuffer();
140
+ if (buf[0] & 0x80) {
141
+ buf = Buffer.concat([Buffer.from([0x80]), buf]);
142
+ } else {
143
+ buf[0] = buf[0] | 0x80;
144
+ }
145
+ } else {
146
+ buf = this.toBuffer();
147
+ if (buf[0] & 0x80) {
148
+ buf = Buffer.concat([Buffer.from([0x00]), buf]);
149
+ }
150
+ }
151
+
152
+ if ((buf.length === 1) & (buf[0] === 0)) {
153
+ buf = Buffer.from([]);
154
+ }
155
+ return buf;
156
+ };
157
+
158
+ /**
159
+ * For big numbers that are either positive or negative, you can convert to
160
+ * "sign magnitude" format whereby the first bit specifies whether the number is
161
+ * positive or negative.
162
+ *
163
+ * @param {Object} opts Defaults to { endian: 'big' }
164
+ */
165
+ BN.prototype.toSM = function (opts) {
166
+ var endian = opts ? opts.endian : 'big';
167
+ var buf = this.toSMBigEndian();
168
+
169
+ if (endian === 'little') {
170
+ buf = reversebuf(buf);
171
+ }
172
+ return buf;
173
+ };
174
+
175
+ /**
176
+ * Create a BN from a "ScriptNum": This is analogous to the constructor for
177
+ * CScriptNum in bitcoind. Many ops in bitcoind's script interpreter use
178
+ * CScriptNum, which is not really a proper bignum. Instead, an error is thrown
179
+ * if trying to input a number bigger than 4 bytes. We copy that behavior here.
180
+ * A third argument, `size`, is provided to extend the hard limit of 4 bytes, as
181
+ * some usages require more than 4 bytes.
182
+ *
183
+ * @param {Buffer} buf A buffer of a number.
184
+ * @param {boolean} fRequireMinimal Whether to require minimal size encoding.
185
+ * @param {number} size The maximum size.
186
+ */
187
+ BN.fromScriptNumBuffer = function (buf, fRequireMinimal, size) {
188
+ var nMaxNumSize = size || Number.MAX_SAFE_INTEGER;
189
+ $.checkArgument(buf.length <= nMaxNumSize, new Error('script number overflow'));
190
+ if (fRequireMinimal && buf.length > 0) {
191
+ // Check that the number is encoded with the minimum possible
192
+ // number of bytes.
193
+ //
194
+ // If the most-significant-byte - excluding the sign bit - is zero
195
+ // then we're not minimal. Note how this test also rejects the
196
+ // negative-zero encoding, 0x80.
197
+ if ((buf[buf.length - 1] & 0x7f) === 0) {
198
+ // One exception: if there's more than one byte and the most
199
+ // significant bit of the second-most-significant-byte is set
200
+ // it would conflict with the sign bit. An example of this case
201
+ // is +-255, which encode to 0xff00 and 0xff80 respectively.
202
+ // (big-endian).
203
+ if (buf.length <= 1 || (buf[buf.length - 2] & 0x80) === 0) {
204
+ throw new Error('non-minimally encoded script number');
205
+ }
206
+ }
207
+ }
208
+ return BN.fromSM(buf, {
209
+ endian: 'little',
210
+ });
211
+ };
212
+
213
+ /**
214
+ * The corollary to the above, with the notable exception that we do not throw
215
+ * an error if the output is larger than four bytes. (Which can happen if
216
+ * performing a numerical operation that results in an overflow to more than 4
217
+ * bytes).
218
+ */
219
+ BN.prototype.toScriptNumBuffer = function () {
220
+ return this.toSM({
221
+ endian: 'little',
222
+ });
223
+ };
224
+
225
+ /**
226
+ * Trims a buffer if it starts with zeros.
227
+ *
228
+ * @param {Buffer} buf A buffer formatted number.
229
+ * @param {number} natlen The natural length of the number.
230
+ */
231
+ BN.trim = function (buf, natlen) {
232
+ return buf.slice(natlen - buf.length, buf.length);
233
+ };
234
+
235
+ /**
236
+ * Adds extra zeros to the start of a number.
237
+ *
238
+ * @param {Buffer} buf A buffer formatted number.
239
+ * @param {number} natlen The natural length of the number.
240
+ * @param {number} size How big to pad the number in bytes.
241
+ */
242
+ BN.pad = function (buf, natlen, size) {
243
+ var rbuf = Buffer.alloc(size);
244
+ for (var i = 0; i < buf.length; i++) {
245
+ rbuf[rbuf.length - 1 - i] = buf[buf.length - 1 - i];
246
+ }
247
+ for (i = 0; i < size - natlen; i++) {
248
+ rbuf[i] = 0;
249
+ }
250
+ return rbuf;
251
+ };
252
+ /**
253
+ * Convert a big number into a hex string. This is somewhat ambiguous, so there
254
+ * is an opts parameter that let's you specify the endianness or the size.
255
+ * opts.endian can be either 'big' or 'little' and opts.size can be any
256
+ * sufficiently large number of bytes. If you always want to create a 32 byte
257
+ * big endian number, then specify opts = { endian: 'big', size: 32 }
258
+ *
259
+ * @param {Object} opts Defaults to { endian: 'big', size: 32 }
260
+ */
261
+ BN.prototype.toHex = function (...args) {
262
+ return this.toBuffer(...args).toString('hex');
263
+ };
264
+
265
+ /**
266
+ * Convert a hex string (such as a 256 bit binary private key) into a big
267
+ * number. Sometimes these numbers can be formatted either as 'big endian' or
268
+ * 'little endian', and so there is an opts parameter that lets you specify
269
+ * which endianness is specified.
270
+ *
271
+ * @param {Buffer} buf A buffer number, such as a 256 bit hash or key.
272
+ * @param {Object} opts With a property 'endian' that can be either 'big' or 'little'. Defaults big endian (most significant digit first).
273
+ */
274
+ BN.fromHex = function (hex, ...args) {
275
+ return BN.fromBuffer(Buffer.from(hex, 'hex'), ...args);
276
+ };
277
+
278
+ export default BN;