@opcat-labs/opcat 1.0.0

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 (138) hide show
  1. package/.mocharc.yaml +3 -0
  2. package/index.d.ts +1541 -0
  3. package/index.js +74 -0
  4. package/lib/address.js +478 -0
  5. package/lib/block/block.js +277 -0
  6. package/lib/block/blockheader.js +295 -0
  7. package/lib/block/index.js +4 -0
  8. package/lib/block/merkleblock.js +323 -0
  9. package/lib/bn.js +3423 -0
  10. package/lib/crypto/bn.js +278 -0
  11. package/lib/crypto/ecdsa.js +339 -0
  12. package/lib/crypto/hash.browser.js +171 -0
  13. package/lib/crypto/hash.js +2 -0
  14. package/lib/crypto/hash.node.js +171 -0
  15. package/lib/crypto/point.js +221 -0
  16. package/lib/crypto/random.browser.js +28 -0
  17. package/lib/crypto/random.js +2 -0
  18. package/lib/crypto/random.node.js +11 -0
  19. package/lib/crypto/signature.js +325 -0
  20. package/lib/encoding/base58.js +111 -0
  21. package/lib/encoding/base58check.js +121 -0
  22. package/lib/encoding/bufferreader.js +212 -0
  23. package/lib/encoding/bufferwriter.js +140 -0
  24. package/lib/encoding/decode-asm.js +24 -0
  25. package/lib/encoding/decode-hex.js +32 -0
  26. package/lib/encoding/decode-script-chunks.js +43 -0
  27. package/lib/encoding/encode-hex.js +284 -0
  28. package/lib/encoding/is-hex.js +7 -0
  29. package/lib/encoding/varint.js +75 -0
  30. package/lib/errors/index.js +54 -0
  31. package/lib/errors/spec.js +314 -0
  32. package/lib/hash-cache.js +50 -0
  33. package/lib/hdprivatekey.js +678 -0
  34. package/lib/hdpublickey.js +525 -0
  35. package/lib/message/message.js +191 -0
  36. package/lib/mnemonic/mnemonic.js +303 -0
  37. package/lib/mnemonic/pbkdf2.browser.js +68 -0
  38. package/lib/mnemonic/pbkdf2.js +2 -0
  39. package/lib/mnemonic/pbkdf2.node.js +68 -0
  40. package/lib/mnemonic/words/chinese.js +2054 -0
  41. package/lib/mnemonic/words/english.js +2054 -0
  42. package/lib/mnemonic/words/french.js +2054 -0
  43. package/lib/mnemonic/words/index.js +8 -0
  44. package/lib/mnemonic/words/italian.js +2054 -0
  45. package/lib/mnemonic/words/japanese.js +2054 -0
  46. package/lib/mnemonic/words/spanish.js +2054 -0
  47. package/lib/networks.js +379 -0
  48. package/lib/opcode.js +255 -0
  49. package/lib/privatekey.js +374 -0
  50. package/lib/publickey.js +386 -0
  51. package/lib/script/index.js +5 -0
  52. package/lib/script/interpreter.js +1834 -0
  53. package/lib/script/script.js +1074 -0
  54. package/lib/script/stack.js +109 -0
  55. package/lib/script/write-i32-le.js +17 -0
  56. package/lib/script/write-push-data.js +35 -0
  57. package/lib/script/write-u16-le.js +12 -0
  58. package/lib/script/write-u32-le.js +16 -0
  59. package/lib/script/write-u64-le.js +24 -0
  60. package/lib/script/write-u8-le.js +8 -0
  61. package/lib/script/write-varint.js +46 -0
  62. package/lib/transaction/index.js +7 -0
  63. package/lib/transaction/input/index.js +5 -0
  64. package/lib/transaction/input/input.js +354 -0
  65. package/lib/transaction/input/multisig.js +242 -0
  66. package/lib/transaction/input/publickey.js +100 -0
  67. package/lib/transaction/input/publickeyhash.js +118 -0
  68. package/lib/transaction/output.js +231 -0
  69. package/lib/transaction/sighash.js +167 -0
  70. package/lib/transaction/signature.js +97 -0
  71. package/lib/transaction/transaction.js +1639 -0
  72. package/lib/transaction/unspentoutput.js +113 -0
  73. package/lib/util/_.js +47 -0
  74. package/lib/util/js.js +90 -0
  75. package/lib/util/preconditions.js +33 -0
  76. package/package.json +26 -0
  77. package/test/address.js +509 -0
  78. package/test/block/block.js +251 -0
  79. package/test/block/blockheader.js +275 -0
  80. package/test/block/merklebloack.js +211 -0
  81. package/test/crypto/bn.js +177 -0
  82. package/test/crypto/ecdsa.js +391 -0
  83. package/test/crypto/hash.browser.js +135 -0
  84. package/test/crypto/hash.js +136 -0
  85. package/test/crypto/point.js +224 -0
  86. package/test/crypto/random.js +32 -0
  87. package/test/crypto/signature.js +409 -0
  88. package/test/data/bip69.json +215 -0
  89. package/test/data/bitcoind/base58_keys_invalid.json +52 -0
  90. package/test/data/bitcoind/base58_keys_valid.json +335 -0
  91. package/test/data/bitcoind/blocks.json +22 -0
  92. package/test/data/bitcoind/script_tests.json +3822 -0
  93. package/test/data/bitcoind/sig_canonical.json +7 -0
  94. package/test/data/bitcoind/sig_noncanonical.json +36 -0
  95. package/test/data/bitcoind/tx_invalid.json +445 -0
  96. package/test/data/bitcoind/tx_valid.json +44 -0
  97. package/test/data/blk86756-testnet.dat +0 -0
  98. package/test/data/blk86756-testnet.js +14 -0
  99. package/test/data/blk86756-testnet.json +684 -0
  100. package/test/data/block.hex +1 -0
  101. package/test/data/ecdsa.json +230 -0
  102. package/test/data/merkleblocks.js +488 -0
  103. package/test/data/messages.json +22 -0
  104. package/test/data/sighash.json +12 -0
  105. package/test/data/tx_creation.json +95 -0
  106. package/test/encoding/base58.js +131 -0
  107. package/test/encoding/base58check.js +136 -0
  108. package/test/encoding/bufferreader.js +337 -0
  109. package/test/encoding/bufferwriter.js +172 -0
  110. package/test/encoding/varint.js +104 -0
  111. package/test/hashCache.js +67 -0
  112. package/test/hdkeys.js +445 -0
  113. package/test/hdprivatekey.js +332 -0
  114. package/test/hdpublickey.js +304 -0
  115. package/test/index.js +16 -0
  116. package/test/message/message.js +204 -0
  117. package/test/mnemonic/data/fixtures.json +300 -0
  118. package/test/mnemonic/mnemonic.js +259 -0
  119. package/test/mnemonic/mocha.opts +1 -0
  120. package/test/mnemonic/pbkdf2.test.js +59 -0
  121. package/test/networks.js +159 -0
  122. package/test/opcode.js +161 -0
  123. package/test/privatekey.js +439 -0
  124. package/test/publickey.js +554 -0
  125. package/test/script/interpreter.js +734 -0
  126. package/test/script/script.js +1437 -0
  127. package/test/transaction/deserialize.js +34 -0
  128. package/test/transaction/input/input.js +90 -0
  129. package/test/transaction/input/multisig.js +90 -0
  130. package/test/transaction/input/publickey.js +68 -0
  131. package/test/transaction/input/publickeyhash.js +51 -0
  132. package/test/transaction/output.js +185 -0
  133. package/test/transaction/sighash.js +65 -0
  134. package/test/transaction/signature.js +114 -0
  135. package/test/transaction/transaction.js +1109 -0
  136. package/test/transaction/unspentoutput.js +110 -0
  137. package/test/util/js.js +76 -0
  138. package/test/util/preconditions.js +79 -0
@@ -0,0 +1,337 @@
1
+ 'use strict';
2
+
3
+ var should = require('chai').should();
4
+ var opcat = require('../..');
5
+ var BufferWriter = opcat.encoding.BufferWriter;
6
+ var BufferReader = opcat.encoding.BufferReader;
7
+ var BN = opcat.crypto.BN;
8
+
9
+ describe('BufferReader', function () {
10
+ it('should make a new BufferReader', function () {
11
+ var br = new BufferReader();
12
+ should.exist(br);
13
+ br = BufferReader();
14
+ should.exist(br);
15
+ });
16
+
17
+ it('should create a new bufferreader with a buffer', function () {
18
+ var buf = Buffer.alloc(0);
19
+ var br = new BufferReader(buf);
20
+ should.exist(br);
21
+ Buffer.isBuffer(br.buf).should.equal(true);
22
+ });
23
+ it('should fail for invalid object', function () {
24
+ var fail = function () {
25
+ return new BufferReader(5);
26
+ };
27
+ fail.should.throw('Unrecognized argument for BufferReader');
28
+ });
29
+
30
+ describe('#set', function () {
31
+ it('should set pos', function () {
32
+ should.exist(
33
+ BufferReader().set({
34
+ pos: 1,
35
+ }).pos,
36
+ );
37
+ });
38
+ });
39
+
40
+ describe('#eof', function () {
41
+ it('should return true for a blank br', function () {
42
+ var br = new BufferReader(Buffer.from([]));
43
+ br.finished().should.equal(true);
44
+ });
45
+ });
46
+
47
+ describe('read', function () {
48
+ it('should return the same buffer', function () {
49
+ var buf = Buffer.from([0]);
50
+ var br = new BufferReader(buf);
51
+ br.readAll().toString('hex').should.equal(buf.toString('hex'));
52
+ });
53
+
54
+ it('should return a buffer of this length', function () {
55
+ var buf = Buffer.alloc(10);
56
+ buf.fill(0);
57
+ var br = new BufferReader(buf);
58
+ var buf2 = br.read(2);
59
+ buf2.length.should.equal(2);
60
+ br.finished().should.equal(false);
61
+ br.pos.should.equal(2);
62
+ });
63
+
64
+ it('should work with 0 length', function () {
65
+ var buf = Buffer.alloc(10);
66
+ buf.fill(1);
67
+ var br = new BufferReader(buf);
68
+ var buf2 = br.read(0);
69
+ buf2.length.should.equal(0);
70
+ br.finished().should.equal(false);
71
+ buf2.toString('hex').should.equal('');
72
+ });
73
+ });
74
+
75
+ describe('readVarLengthBuffer', function () {
76
+ it('returns correct buffer', function () {
77
+ var buf = Buffer.from(
78
+ '73010000003766404f00000000b305434f00000000f203' +
79
+ '0000f1030000001027000048ee00000064000000004653656520626974636f696' +
80
+ 'e2e6f72672f666562323020696620796f7520686176652074726f75626c652063' +
81
+ '6f6e6e656374696e6720616674657220323020466562727561727900473045022' +
82
+ '1008389df45f0703f39ec8c1cc42c13810ffcae14995bb648340219e353b63b53' +
83
+ 'eb022009ec65e1c1aaeec1fd334c6b684bde2b3f573060d5b70c3a46723326e4e' +
84
+ '8a4f1',
85
+ 'hex',
86
+ );
87
+ var br = new BufferReader(buf);
88
+ var b1 = br.readVarLengthBuffer();
89
+ b1.toString('hex').should.equal(
90
+ '010000003766404f00000000b305434f000' +
91
+ '00000f2030000f1030000001027000048ee000000640000000046536565206269' +
92
+ '74636f696e2e6f72672f666562323020696620796f7520686176652074726f756' +
93
+ '26c6520636f6e6e656374696e6720616674657220323020466562727561727900',
94
+ );
95
+ var b2 = br.readVarLengthBuffer();
96
+ b2.toString('hex').should.equal(
97
+ '30450221008389df45f0703f39ec8c1cc42' +
98
+ 'c13810ffcae14995bb648340219e353b63b53eb022009ec65e1c1aaeec1fd334c' +
99
+ '6b684bde2b3f573060d5b70c3a46723326e4e8a4f1',
100
+ );
101
+ });
102
+ it('fails on length too big', function () {
103
+ var buf = Buffer.from('0a00', 'hex');
104
+ var br = new BufferReader(buf);
105
+ br.readVarLengthBuffer.bind(br).should.throw('Invalid length while reading varlength buffer');
106
+ });
107
+ });
108
+
109
+ describe('#readUInt8', function () {
110
+ it('should return 1', function () {
111
+ var buf = Buffer.alloc(1);
112
+ buf.writeUInt8(1, 0);
113
+ var br = new BufferReader(buf);
114
+ br.readUInt8().should.equal(1);
115
+ });
116
+ });
117
+
118
+ describe('#readUInt16BE', function () {
119
+ it('should return 1', function () {
120
+ var buf = Buffer.alloc(2);
121
+ buf.writeUInt16BE(1, 0);
122
+ var br = new BufferReader(buf);
123
+ br.readUInt16BE().should.equal(1);
124
+ });
125
+ });
126
+
127
+ describe('#readUInt16LE', function () {
128
+ it('should return 1', function () {
129
+ var buf = Buffer.alloc(2);
130
+ buf.writeUInt16LE(1, 0);
131
+ var br = new BufferReader(buf);
132
+ br.readUInt16LE().should.equal(1);
133
+ });
134
+ });
135
+
136
+ describe('#readUInt32BE', function () {
137
+ it('should return 1', function () {
138
+ var buf = Buffer.alloc(4);
139
+ buf.writeUInt32BE(1, 0);
140
+ var br = new BufferReader(buf);
141
+ br.readUInt32BE().should.equal(1);
142
+ });
143
+ });
144
+
145
+ describe('#readUInt32LE', function () {
146
+ it('should return 1', function () {
147
+ var buf = Buffer.alloc(4);
148
+ buf.writeUInt32LE(1, 0);
149
+ var br = new BufferReader(buf);
150
+ br.readUInt32LE().should.equal(1);
151
+ });
152
+ });
153
+
154
+ describe('#readUInt64BEBN', function () {
155
+ it('should return 1', function () {
156
+ var buf = Buffer.alloc(8);
157
+ buf.fill(0);
158
+ buf.writeUInt32BE(1, 4);
159
+ var br = new BufferReader(buf);
160
+ br.readUInt64BEBN().toNumber().should.equal(1);
161
+ });
162
+
163
+ it('should return 2^64', function () {
164
+ var buf = Buffer.alloc(8);
165
+ buf.fill(0xff);
166
+ var br = new BufferReader(buf);
167
+ br.readUInt64BEBN().toNumber().should.equal(Math.pow(2, 64));
168
+ });
169
+ });
170
+
171
+ describe('#readUInt64LEBN', function () {
172
+ it('should return 1', function () {
173
+ var buf = Buffer.alloc(8);
174
+ buf.fill(0);
175
+ buf.writeUInt32LE(1, 0);
176
+ var br = new BufferReader(buf);
177
+ br.readUInt64LEBN().toNumber().should.equal(1);
178
+ });
179
+
180
+ it('should return 10 OPCAT', function () {
181
+ var tenopcat = 10 * 1e8;
182
+ var tenopcatBuffer = Buffer.from('00ca9a3b00000000', 'hex');
183
+ var br = new BufferReader(tenopcatBuffer);
184
+ br.readUInt64LEBN().toNumber().should.equal(tenopcat);
185
+ });
186
+
187
+ it('should return 2^30', function () {
188
+ var buf = Buffer.alloc(8);
189
+ buf.fill(0);
190
+ buf.writeUInt32LE(Math.pow(2, 30), 0);
191
+ var br = new BufferReader(buf);
192
+ br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 30));
193
+ });
194
+
195
+ it('should return 2^32 + 1', function () {
196
+ var num = Math.pow(2, 32) + 1;
197
+ var numBuffer = Buffer.from('0100000001000000', 'hex');
198
+ var br = new BufferReader(numBuffer);
199
+ br.readUInt64LEBN().toNumber().should.equal(num);
200
+ });
201
+
202
+ it('should return max number of satoshis', function () {
203
+ var maxSatoshis = 21000000 * 1e8;
204
+ var maxSatoshisBuffer = Buffer.from('0040075af0750700', 'hex');
205
+ var br = new BufferReader(maxSatoshisBuffer);
206
+ br.readUInt64LEBN().toNumber().should.equal(maxSatoshis);
207
+ });
208
+
209
+ it('should return 2^53 - 1', function () {
210
+ var maxSafe = Math.pow(2, 53) - 1;
211
+ var maxSafeBuffer = Buffer.from('ffffffffffff1f00', 'hex');
212
+ var br = new BufferReader(maxSafeBuffer);
213
+ br.readUInt64LEBN().toNumber().should.equal(maxSafe);
214
+ });
215
+
216
+ it('should return 2^53', function () {
217
+ var bn = new BN('20000000000000', 16);
218
+ var bnBuffer = Buffer.from('0000000000002000', 'hex');
219
+ var br = new BufferReader(bnBuffer);
220
+ var readbn = br.readUInt64LEBN();
221
+ readbn.cmp(bn).should.equal(0);
222
+ });
223
+
224
+ it('should return 0', function () {
225
+ var buf = Buffer.alloc(8);
226
+ buf.fill(0);
227
+ var br = new BufferReader(buf);
228
+ br.readUInt64LEBN().toNumber().should.equal(0);
229
+ });
230
+
231
+ it('should return 2^64', function () {
232
+ var buf = Buffer.alloc(8);
233
+ buf.fill(0xff);
234
+ var br = new BufferReader(buf);
235
+ br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 64));
236
+ });
237
+ });
238
+
239
+ describe('#readVarintBuf', function () {
240
+ it('should read a 1 byte varint', function () {
241
+ var buf = Buffer.from([50]);
242
+ var br = new BufferReader(buf);
243
+ br.readVarintBuf().length.should.equal(1);
244
+ });
245
+
246
+ it('should read a 3 byte varint', function () {
247
+ var buf = Buffer.from([253, 253, 0]);
248
+ var br = new BufferReader(buf);
249
+ br.readVarintBuf().length.should.equal(3);
250
+ });
251
+
252
+ it('should read a 5 byte varint', function () {
253
+ var buf = Buffer.from([254, 0, 0, 0, 0]);
254
+ buf.writeUInt32LE(50000, 1);
255
+ var br = new BufferReader(buf);
256
+ br.readVarintBuf().length.should.equal(5);
257
+ });
258
+
259
+ it('should read a 9 byte varint', function () {
260
+ var buf = new BufferWriter().writeVarintBN(new BN(Math.pow(2, 54).toString())).concat();
261
+ var br = new BufferReader(buf);
262
+ br.readVarintBuf().length.should.equal(9);
263
+ });
264
+ });
265
+
266
+ describe('#readVarintNum', function () {
267
+ it('should read a 1 byte varint', function () {
268
+ var buf = Buffer.from([50]);
269
+ var br = new BufferReader(buf);
270
+ br.readVarintNum().should.equal(50);
271
+ });
272
+
273
+ it('should read a 3 byte varint', function () {
274
+ var buf = Buffer.from([253, 253, 0]);
275
+ var br = new BufferReader(buf);
276
+ br.readVarintNum().should.equal(253);
277
+ });
278
+
279
+ it('should read a 5 byte varint', function () {
280
+ var buf = Buffer.from([254, 0, 0, 0, 0]);
281
+ buf.writeUInt32LE(50000, 1);
282
+ var br = new BufferReader(buf);
283
+ br.readVarintNum().should.equal(50000);
284
+ });
285
+
286
+ it('should throw an error on a 9 byte varint over the javascript uint precision limit', function () {
287
+ var buf = new BufferWriter().writeVarintBN(new BN(Math.pow(2, 54).toString())).concat();
288
+ var br = new BufferReader(buf);
289
+ (function () {
290
+ br.readVarintNum();
291
+ }).should.throw('number too large to retain precision - use readVarintBN');
292
+ });
293
+
294
+ it('should not throw an error on a 9 byte varint not over the javascript uint precision limit', function () {
295
+ var buf = new BufferWriter().writeVarintBN(new BN(Math.pow(2, 53).toString())).concat();
296
+ var br = new BufferReader(buf);
297
+ (function () {
298
+ br.readVarintNum();
299
+ }).should.not.throw('number too large to retain precision - use readVarintBN');
300
+ });
301
+ });
302
+
303
+ describe('#readVarintBN', function () {
304
+ it('should read a 1 byte varint', function () {
305
+ var buf = Buffer.from([50]);
306
+ var br = new BufferReader(buf);
307
+ br.readVarintBN().toNumber().should.equal(50);
308
+ });
309
+
310
+ it('should read a 3 byte varint', function () {
311
+ var buf = Buffer.from([253, 253, 0]);
312
+ var br = new BufferReader(buf);
313
+ br.readVarintBN().toNumber().should.equal(253);
314
+ });
315
+
316
+ it('should read a 5 byte varint', function () {
317
+ var buf = Buffer.from([254, 0, 0, 0, 0]);
318
+ buf.writeUInt32LE(50000, 1);
319
+ var br = new BufferReader(buf);
320
+ br.readVarintBN().toNumber().should.equal(50000);
321
+ });
322
+
323
+ it('should read a 9 byte varint', function () {
324
+ var buf = Buffer.concat([Buffer.from([255]), Buffer.from('ffffffffffffffff', 'hex')]);
325
+ var br = new BufferReader(buf);
326
+ br.readVarintBN().toNumber().should.equal(Math.pow(2, 64));
327
+ });
328
+ });
329
+
330
+ describe('#reverse', function () {
331
+ it('should reverse this [0, 1]', function () {
332
+ var buf = Buffer.from([0, 1]);
333
+ var br = new BufferReader(buf);
334
+ br.reverse().readAll().toString('hex').should.equal('0100');
335
+ });
336
+ });
337
+ });
@@ -0,0 +1,172 @@
1
+ 'use strict';
2
+
3
+ var opcat = require('../..');
4
+ var should = require('chai').should();
5
+ var expect = require('chai').expect;
6
+ var BufferWriter = opcat.encoding.BufferWriter;
7
+ var BufferReader = opcat.encoding.BufferReader;
8
+ var BN = opcat.crypto.BN;
9
+
10
+ describe('BufferWriter', function () {
11
+ it('should create a new buffer writer', function () {
12
+ var bw = new BufferWriter();
13
+ should.exist(bw);
14
+ });
15
+
16
+ describe('#set', function () {
17
+ it('set bufs', function () {
18
+ var buf1 = Buffer.from([0]);
19
+ var buf2 = Buffer.from([1]);
20
+ var bw = new BufferWriter().set({ bufs: [buf1, buf2] });
21
+ bw.concat().toString('hex').should.equal('0001');
22
+ });
23
+ });
24
+
25
+ describe('#toBuffer', function () {
26
+ it('should concat these two bufs', function () {
27
+ var buf1 = Buffer.from([0]);
28
+ var buf2 = Buffer.from([1]);
29
+ var bw = new BufferWriter({ bufs: [buf1, buf2] });
30
+ bw.toBuffer().toString('hex').should.equal('0001');
31
+ });
32
+ });
33
+
34
+ describe('#concat', function () {
35
+ it('should concat these two bufs', function () {
36
+ var buf1 = Buffer.from([0]);
37
+ var buf2 = Buffer.from([1]);
38
+ var bw = new BufferWriter({ bufs: [buf1, buf2] });
39
+ bw.concat().toString('hex').should.equal('0001');
40
+ });
41
+ });
42
+
43
+ describe('#write', function () {
44
+ it('should write a buffer', function () {
45
+ var buf = Buffer.from([0]);
46
+ var bw = new BufferWriter();
47
+ bw.write(buf);
48
+ bw.concat().toString('hex').should.equal('00');
49
+ });
50
+ });
51
+
52
+ describe('#writeUInt8', function () {
53
+ it('should write 1', function () {
54
+ var bw = new BufferWriter();
55
+ bw.writeUInt8(1).concat().toString('hex').should.equal('01');
56
+ });
57
+ });
58
+
59
+ describe('#writeUInt16BE', function () {
60
+ it('should write 1', function () {
61
+ var bw = new BufferWriter();
62
+ bw.writeUInt16BE(1).concat().toString('hex').should.equal('0001');
63
+ });
64
+ });
65
+
66
+ describe('#writeUInt16LE', function () {
67
+ it('should write 1', function () {
68
+ var bw = new BufferWriter();
69
+ bw.writeUInt16LE(1).concat().toString('hex').should.equal('0100');
70
+ });
71
+ });
72
+
73
+ describe('#writeUInt32BE', function () {
74
+ it('should write 1', function () {
75
+ var bw = new BufferWriter();
76
+ bw.writeUInt32BE(1).concat().toString('hex').should.equal('00000001');
77
+ });
78
+ });
79
+
80
+ describe('#writeUInt32LE', function () {
81
+ it('should write 1', function () {
82
+ var bw = new BufferWriter();
83
+ bw.writeUInt32LE(1).concat().toString('hex').should.equal('01000000');
84
+ });
85
+ });
86
+
87
+ describe('#writeUInt64BEBN', function () {
88
+ it('should write 1', function () {
89
+ var bw = new BufferWriter();
90
+ bw.writeUInt64BEBN(new BN(1)).concat().toString('hex').should.equal('0000000000000001');
91
+ });
92
+ });
93
+
94
+ describe('#writeUInt64LEBN', function () {
95
+ it('should write 1', function () {
96
+ var bw = new BufferWriter();
97
+ bw.writeUInt64LEBN(new BN(1)).concat().toString('hex').should.equal('0100000000000000');
98
+ });
99
+ });
100
+
101
+ describe('#writeVarint', function () {
102
+ it('should write a 1 byte varint', function () {
103
+ var bw = new BufferWriter();
104
+ bw.writeVarintNum(1);
105
+ bw.concat().length.should.equal(1);
106
+ });
107
+
108
+ it('should write a 3 byte varint', function () {
109
+ var bw = new BufferWriter();
110
+ bw.writeVarintNum(1000);
111
+ bw.concat().length.should.equal(3);
112
+ });
113
+
114
+ it('should write a 5 byte varint', function () {
115
+ var bw = new BufferWriter();
116
+ bw.writeVarintNum(Math.pow(2, 16 + 1));
117
+ bw.concat().length.should.equal(5);
118
+ });
119
+
120
+ it('should write a 9 byte varint', function () {
121
+ var bw = new BufferWriter();
122
+ bw.writeVarintNum(Math.pow(2, 32 + 1));
123
+ bw.concat().length.should.equal(9);
124
+ });
125
+
126
+ it('should read back the same value it wrote for a 8 byte varint', function () {
127
+ var bw = new BufferWriter();
128
+ var n = Math.pow(2, 53);
129
+ n.should.equal(n + 1); // javascript number precision limit
130
+ bw.writeVarintNum(n - 1);
131
+ var br = new BufferReader({ buf: bw.concat() });
132
+ br.readVarintBN()
133
+ .toNumber()
134
+ .should.equal(n - 1);
135
+ });
136
+
137
+ it('should throw for a 9 byte varint', function () {
138
+ expect(function () {
139
+ var bw = new BufferWriter();
140
+ var n = Math.pow(2, 53);
141
+ n.should.equal(n + 1); // javascript number precision limit
142
+ bw.writeVarintNum(n);
143
+ }).to.throw('varint too large');
144
+ });
145
+ });
146
+
147
+ describe('#writeVarintBN', function () {
148
+ it('should write a 1 byte varint', function () {
149
+ var bw = new BufferWriter();
150
+ bw.writeVarintBN(new BN(1));
151
+ bw.concat().length.should.equal(1);
152
+ });
153
+
154
+ it('should write a 3 byte varint', function () {
155
+ var bw = new BufferWriter();
156
+ bw.writeVarintBN(new BN(1000));
157
+ bw.concat().length.should.equal(3);
158
+ });
159
+
160
+ it('should write a 5 byte varint', function () {
161
+ var bw = new BufferWriter();
162
+ bw.writeVarintBN(new BN(Math.pow(2, 16 + 1)));
163
+ bw.concat().length.should.equal(5);
164
+ });
165
+
166
+ it('should write a 9 byte varint', function () {
167
+ var bw = new BufferWriter();
168
+ bw.writeVarintBN(new BN(Math.pow(2, 32 + 1)));
169
+ bw.concat().length.should.equal(9);
170
+ });
171
+ });
172
+ });
@@ -0,0 +1,104 @@
1
+ 'use strict';
2
+
3
+ var should = require('chai').should();
4
+ var opcat = require('../..');
5
+ var BN = opcat.crypto.BN;
6
+ var BufferReader = opcat.encoding.BufferReader;
7
+ var BufferWriter = opcat.encoding.BufferWriter;
8
+ var Varint = opcat.encoding.Varint;
9
+
10
+ describe('Varint', function () {
11
+ it('should make a new varint', function () {
12
+ var buf = Buffer.from('00', 'hex');
13
+ var varint = new Varint(buf);
14
+ should.exist(varint);
15
+ varint.buf.toString('hex').should.equal('00');
16
+ varint = Varint(buf);
17
+ should.exist(varint);
18
+ varint.buf.toString('hex').should.equal('00');
19
+
20
+ // various ways to use the constructor
21
+ Varint(Varint(0).toBuffer()).toNumber().should.equal(0);
22
+ Varint(0).toNumber().should.equal(0);
23
+ Varint(new BN(0)).toNumber().should.equal(0);
24
+ });
25
+
26
+ describe('#set', function () {
27
+ it('should set a buffer', function () {
28
+ var buf = Buffer.from('00', 'hex');
29
+ var varint = Varint().set({ buf: buf });
30
+ varint.buf.toString('hex').should.equal('00');
31
+ varint.set({});
32
+ varint.buf.toString('hex').should.equal('00');
33
+ });
34
+ });
35
+
36
+ describe('#fromString', function () {
37
+ it('should set a buffer', function () {
38
+ var buf = new BufferWriter().writeVarintNum(5).concat();
39
+ var varint = Varint().fromString(buf.toString('hex'));
40
+ varint.toNumber().should.equal(5);
41
+ });
42
+ });
43
+
44
+ describe('#toString', function () {
45
+ it('should return a buffer', function () {
46
+ var buf = new BufferWriter().writeVarintNum(5).concat();
47
+ var varint = Varint().fromString(buf.toString('hex'));
48
+ varint.toString().should.equal('05');
49
+ });
50
+ });
51
+
52
+ describe('#fromBuffer', function () {
53
+ it('should set a buffer', function () {
54
+ var buf = new BufferWriter().writeVarintNum(5).concat();
55
+ var varint = Varint().fromBuffer(buf);
56
+ varint.toNumber().should.equal(5);
57
+ });
58
+ });
59
+
60
+ describe('#fromBufferReader', function () {
61
+ it('should set a buffer reader', function () {
62
+ var buf = new BufferWriter().writeVarintNum(5).concat();
63
+ var br = BufferReader(buf);
64
+ var varint = Varint().fromBufferReader(br);
65
+ varint.toNumber().should.equal(5);
66
+ });
67
+ });
68
+
69
+ describe('#fromBN', function () {
70
+ it('should set a number', function () {
71
+ var varint = Varint().fromBN(new BN(5));
72
+ varint.toNumber().should.equal(5);
73
+ });
74
+ });
75
+
76
+ describe('#fromNumber', function () {
77
+ it('should set a number', function () {
78
+ var varint = Varint().fromNumber(5);
79
+ varint.toNumber().should.equal(5);
80
+ });
81
+ });
82
+
83
+ describe('#toBuffer', function () {
84
+ it('should return a buffer', function () {
85
+ var buf = new BufferWriter().writeVarintNum(5).concat();
86
+ var varint = Varint(buf);
87
+ varint.toBuffer().toString('hex').should.equal(buf.toString('hex'));
88
+ });
89
+ });
90
+
91
+ describe('#toBN', function () {
92
+ it('should return a buffer', function () {
93
+ var varint = Varint(5);
94
+ varint.toBN().toString().should.equal(new BN(5).toString());
95
+ });
96
+ });
97
+
98
+ describe('#toNumber', function () {
99
+ it('should return a buffer', function () {
100
+ var varint = Varint(5);
101
+ varint.toNumber().should.equal(5);
102
+ });
103
+ });
104
+ });
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+ var HashCache = require('../lib/hash-cache');
3
+ var chai = require('chai');
4
+ var should = chai.should();
5
+
6
+ describe('HashCache', function () {
7
+ const prevoutsHashBuf = Buffer.from('01'.repeat(32), 'hex');
8
+ const sequenceHashBuf = Buffer.from('02'.repeat(32), 'hex');
9
+ const outputsHashBuf = Buffer.from('03'.repeat(32), 'hex');
10
+
11
+ it('should satisfy this basic API', function () {
12
+ const hashCache = new HashCache(prevoutsHashBuf, sequenceHashBuf, outputsHashBuf);
13
+ should.exist(hashCache);
14
+ hashCache.prevoutsHashBuf.length.should.equal(32);
15
+ hashCache.sequenceHashBuf.length.should.equal(32);
16
+ hashCache.outputsHashBuf.length.should.equal(32);
17
+ });
18
+
19
+ describe('#fromBuffer', function () {
20
+ it('should parse this known message', function () {
21
+ const hashCache = HashCache.fromBuffer(
22
+ new HashCache(prevoutsHashBuf, sequenceHashBuf, outputsHashBuf).toBuffer(),
23
+ );
24
+ hashCache
25
+ .toHex()
26
+ .should.equal(
27
+ '7b22707265766f75747348617368427566223a2230313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031222c2273657175656e636548617368427566223a2230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032222c226f75747075747348617368427566223a2230333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033227d',
28
+ );
29
+ });
30
+ });
31
+
32
+ describe('#toBuffer', function () {
33
+ it('should parse this known message', function () {
34
+ const hashCache = new HashCache(prevoutsHashBuf, sequenceHashBuf, outputsHashBuf);
35
+ hashCache
36
+ .toBuffer()
37
+ .toString('hex')
38
+ .should.equal(
39
+ '7b22707265766f75747348617368427566223a2230313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031222c2273657175656e636548617368427566223a2230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032222c226f75747075747348617368427566223a2230333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033227d',
40
+ );
41
+ });
42
+ });
43
+
44
+ describe('#fromJSON', function () {
45
+ it('should parse this known json hashCache', function () {
46
+ HashCache.fromJSON(
47
+ JSON.parse(
48
+ '{"prevoutsHashBuf":"0101010101010101010101010101010101010101010101010101010101010101","sequenceHashBuf":"0202020202020202020202020202020202020202020202020202020202020202","outputsHashBuf":"0303030303030303030303030303030303030303030303030303030303030303"}',
49
+ ),
50
+ )
51
+ .toHex()
52
+ .should.equal(
53
+ '7b22707265766f75747348617368427566223a2230313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031303130313031222c2273657175656e636548617368427566223a2230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032303230323032222c226f75747075747348617368427566223a2230333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033303330333033227d',
54
+ );
55
+ });
56
+ });
57
+
58
+ describe('#toJSON', function () {
59
+ it('should create this known message', function () {
60
+ JSON.stringify(
61
+ new HashCache(prevoutsHashBuf, sequenceHashBuf, outputsHashBuf).toJSON(),
62
+ ).should.equal(
63
+ '{"prevoutsHashBuf":"0101010101010101010101010101010101010101010101010101010101010101","sequenceHashBuf":"0202020202020202020202020202020202020202020202020202020202020202","outputsHashBuf":"0303030303030303030303030303030303030303030303030303030303030303"}',
64
+ );
65
+ });
66
+ });
67
+ });