@smartledger/bsv 5.4.2 → 5.5.1

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 (93) hide show
  1. package/.mocharc.json +5 -0
  2. package/CHANGELOG.md +66 -0
  3. package/README.md +28 -8
  4. package/bsv-covenant.min.js +8 -8
  5. package/bsv-gdaf.min.js +11 -11
  6. package/bsv-ltp.min.js +11 -11
  7. package/bsv-smartcontract.min.js +8 -8
  8. package/bsv.bundle.js +11 -11
  9. package/bsv.min.js +11 -11
  10. package/lib/smart_contract/authorizers.js +159 -0
  11. package/lib/smart_contract/covenant_helpers.js +3 -3
  12. package/lib/smart_contract/dsl.js +1 -1
  13. package/lib/smart_contract/index.js +9 -8
  14. package/lib/smart_contract/pels.js +1 -0
  15. package/lib/smart_contract/pushtx.js +51 -7
  16. package/lib/smart_contract/token.js +179 -35
  17. package/package.json +3 -1
  18. package/test/address.js +629 -0
  19. package/test/block/block.js +239 -0
  20. package/test/block/blockheader.js +270 -0
  21. package/test/block/merkleblock.js +207 -0
  22. package/test/cli/smoke.js +261 -0
  23. package/test/credentials-test.js +329 -0
  24. package/test/crypto/bn.js +168 -0
  25. package/test/crypto/ecdsa.js +328 -0
  26. package/test/crypto/elliptic-fixed.js +61 -0
  27. package/test/crypto/hash.browser.js +121 -0
  28. package/test/crypto/hash.js +122 -0
  29. package/test/crypto/point.js +193 -0
  30. package/test/crypto/random.js +32 -0
  31. package/test/crypto/security.js +127 -0
  32. package/test/crypto/shamir.js +169 -0
  33. package/test/crypto/signature.js +318 -0
  34. package/test/data/bip69.json +215 -0
  35. package/test/data/bitcoind/base58_keys_invalid.json +152 -0
  36. package/test/data/bitcoind/base58_keys_valid.json +452 -0
  37. package/test/data/bitcoind/blocks.json +27 -0
  38. package/test/data/bitcoind/script_tests.json +2244 -0
  39. package/test/data/bitcoind/sig_canonical.json +7 -0
  40. package/test/data/bitcoind/sig_noncanonical.json +22 -0
  41. package/test/data/bitcoind/tx_invalid.json +177 -0
  42. package/test/data/bitcoind/tx_valid.json +224 -0
  43. package/test/data/blk86756-testnet.dat +0 -0
  44. package/test/data/blk86756-testnet.js +12 -0
  45. package/test/data/blk86756-testnet.json +684 -0
  46. package/test/data/ecdsa.json +230 -0
  47. package/test/data/merkleblocks.js +486 -0
  48. package/test/data/messages.json +22 -0
  49. package/test/data/sighash.json +1004 -0
  50. package/test/data/tx_creation.json +85 -0
  51. package/test/ecies/bitcore-ecies.js +170 -0
  52. package/test/ecies/electrum-ecies.js +206 -0
  53. package/test/encoding/base58.js +131 -0
  54. package/test/encoding/base58check.js +136 -0
  55. package/test/encoding/bufferreader.js +328 -0
  56. package/test/encoding/bufferwriter.js +160 -0
  57. package/test/encoding/varint.js +104 -0
  58. package/test/gdaf/canonicalize.js +140 -0
  59. package/test/hdkeys.js +365 -0
  60. package/test/hdprivatekey.js +330 -0
  61. package/test/hdpublickey.js +293 -0
  62. package/test/index.js +16 -0
  63. package/test/ltp/right.js +198 -0
  64. package/test/message/message.js +190 -0
  65. package/test/mnemonic/data/fixtures.json +300 -0
  66. package/test/mnemonic/mnemonic.js +245 -0
  67. package/test/mnemonic/mocha.opts +1 -0
  68. package/test/mnemonic/pbkdf2.test.js +43 -0
  69. package/test/networks.js +162 -0
  70. package/test/opcode.js +161 -0
  71. package/test/privatekey.js +430 -0
  72. package/test/publickey.js +411 -0
  73. package/test/script/genesis_limits.js +80 -0
  74. package/test/script/interpreter.js +723 -0
  75. package/test/script/script.js +1256 -0
  76. package/test/script/string_ops.js +72 -0
  77. package/test/smart_contract/covenants.js +247 -0
  78. package/test/smart_contract/dsl_debugger.js +103 -0
  79. package/test/smart_contract/token_generalized.js +187 -0
  80. package/test/transaction/deserialize.js +33 -0
  81. package/test/transaction/input/input.js +92 -0
  82. package/test/transaction/input/multisig.js +174 -0
  83. package/test/transaction/input/multisigscripthash.js +111 -0
  84. package/test/transaction/input/publickey.js +68 -0
  85. package/test/transaction/input/publickeyhash.js +59 -0
  86. package/test/transaction/output.js +185 -0
  87. package/test/transaction/sighash.js +71 -0
  88. package/test/transaction/signature.js +127 -0
  89. package/test/transaction/transaction.js +1299 -0
  90. package/test/transaction/unspentoutput.js +92 -0
  91. package/test/util/js.js +76 -0
  92. package/test/util/preconditions.js +79 -0
  93. package/test/vcjwt/interop.js +126 -0
@@ -0,0 +1,136 @@
1
+ 'use strict'
2
+
3
+ var should = require('chai').should()
4
+ var bsv = require('../..')
5
+ var Base58Check = bsv.encoding.Base58Check
6
+ var Base58 = bsv.encoding.Base58
7
+
8
+ describe('Base58Check', function () {
9
+ var buf = Buffer.from([0, 1, 2, 3, 253, 254, 255])
10
+ var enc = '14HV44ipwoaqfg'
11
+
12
+ it('should make an instance with "new"', function () {
13
+ var b58 = new Base58Check()
14
+ should.exist(b58)
15
+ })
16
+
17
+ it('can validate a serialized string', function () {
18
+ var address = '3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy'
19
+ Base58Check.validChecksum(address).should.equal(true)
20
+ address = address + 'a'
21
+ Base58Check.validChecksum(address).should.equal(false)
22
+ })
23
+
24
+ it('should make an instance without "new"', function () {
25
+ var b58 = Base58Check()
26
+ should.exist(b58)
27
+ })
28
+
29
+ it('should allow this handy syntax', function () {
30
+ Base58Check(buf).toString().should.equal(enc)
31
+ Base58Check(enc).toBuffer().toString('hex').should.equal(buf.toString('hex'))
32
+ })
33
+
34
+ describe('#set', function () {
35
+ it('should set a buf', function () {
36
+ should.exist(Base58Check().set({ buf: buf }).buf)
37
+ })
38
+ })
39
+
40
+ describe('@encode', function () {
41
+ it('should encode the buffer accurately', function () {
42
+ Base58Check.encode(buf).should.equal(enc)
43
+ })
44
+
45
+ it('should throw an error when the input is not a buffer', function () {
46
+ (function () {
47
+ Base58Check.encode('string')
48
+ }).should.throw('Input must be a buffer')
49
+ })
50
+ })
51
+
52
+ describe('@decode', function () {
53
+ it('should decode this encoded value correctly', function () {
54
+ Base58Check.decode(enc).toString('hex').should.equal(buf.toString('hex'))
55
+ })
56
+
57
+ it('should throw an error when input is not a string', function () {
58
+ (function () {
59
+ Base58Check.decode(5)
60
+ }).should.throw('Input must be a string')
61
+ })
62
+
63
+ it('should throw an error when input is too short', function () {
64
+ (function () {
65
+ Base58Check.decode(enc.slice(0, 1))
66
+ }).should.throw('Input string too short')
67
+ })
68
+
69
+ it('should throw an error when there is a checksum mismatch', function () {
70
+ var buf2 = Base58.decode(enc)
71
+ buf2[0] = buf2[0] + 1
72
+ var enc2 = Base58.encode(buf2);
73
+ (function () {
74
+ Base58Check.decode(enc2)
75
+ }).should.throw('Checksum mismatch')
76
+ })
77
+ })
78
+
79
+ describe('#fromBuffer', function () {
80
+ it('should not fail', function () {
81
+ should.exist(Base58Check().fromBuffer(buf))
82
+ })
83
+
84
+ it('should set buffer', function () {
85
+ var b58 = Base58Check().fromBuffer(buf)
86
+ b58.toHex().should.equal(buf.toString('hex'))
87
+ })
88
+ })
89
+
90
+ describe('@fromBuffer', function () {
91
+ it('should set buffer', function () {
92
+ var b58 = Base58Check.fromBuffer(buf)
93
+ b58.buf.toString('hex').should.equal(buf.toString('hex'))
94
+ })
95
+ })
96
+
97
+ describe('@fromHex', function () {
98
+ it('should set hex', function () {
99
+ var b58 = Base58Check.fromHex(buf.toString('hex'))
100
+ b58.buf.toString('hex').should.equal(buf.toString('hex'))
101
+ })
102
+ })
103
+
104
+ describe('#fromString', function () {
105
+ it('should convert this known string to a buffer', function () {
106
+ Base58Check().fromString(enc).toBuffer().toString('hex').should.equal(buf.toString('hex'))
107
+ })
108
+ })
109
+
110
+ describe('@fromString', function () {
111
+ it('should convert this known string to a buffer', function () {
112
+ Base58Check.fromString(enc).toBuffer().toString('hex').should.equal(buf.toString('hex'))
113
+ })
114
+ })
115
+
116
+ describe('#toBuffer', function () {
117
+ it('should return the buffer', function () {
118
+ var b58 = Base58Check(buf)
119
+ b58.toBuffer().toString('hex').should.equal(buf.toString('hex'))
120
+ })
121
+ })
122
+
123
+ describe('#toHex', function () {
124
+ it('should return the hex', function () {
125
+ var b58 = Base58Check(buf)
126
+ b58.toHex().should.equal(buf.toString('hex'))
127
+ })
128
+ })
129
+
130
+ describe('#toString', function () {
131
+ it('should return the buffer', function () {
132
+ var b58 = Base58Check(buf)
133
+ b58.toString().should.equal(enc)
134
+ })
135
+ })
136
+ })
@@ -0,0 +1,328 @@
1
+ 'use strict'
2
+
3
+ var should = require('chai').should()
4
+ var bsv = require('../..')
5
+ var BufferWriter = bsv.encoding.BufferWriter
6
+ var BufferReader = bsv.encoding.BufferReader
7
+ var BN = bsv.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(BufferReader().set({
33
+ pos: 1
34
+ }).pos)
35
+ })
36
+ })
37
+
38
+ describe('#eof', function () {
39
+ it('should return true for a blank br', function () {
40
+ var br = new BufferReader(Buffer.from([]))
41
+ br.finished().should.equal(true)
42
+ })
43
+ })
44
+
45
+ describe('read', function () {
46
+ it('should return the same buffer', function () {
47
+ var buf = Buffer.from([0])
48
+ var br = new BufferReader(buf)
49
+ br.readAll().toString('hex').should.equal(buf.toString('hex'))
50
+ })
51
+
52
+ it('should return a buffer of this length', function () {
53
+ var buf = Buffer.alloc(10)
54
+ buf.fill(0)
55
+ var br = new BufferReader(buf)
56
+ var buf2 = br.read(2)
57
+ buf2.length.should.equal(2)
58
+ br.finished().should.equal(false)
59
+ br.pos.should.equal(2)
60
+ })
61
+
62
+ it('should work with 0 length', function () {
63
+ var buf = Buffer.alloc(10)
64
+ buf.fill(1)
65
+ var br = new BufferReader(buf)
66
+ var buf2 = br.read(0)
67
+ buf2.length.should.equal(0)
68
+ br.finished().should.equal(false)
69
+ buf2.toString('hex').should.equal('')
70
+ })
71
+ })
72
+
73
+ describe('readVarLengthBuffer', function () {
74
+ it('returns correct buffer', function () {
75
+ var buf = Buffer.from('73010000003766404f00000000b305434f00000000f203' +
76
+ '0000f1030000001027000048ee00000064000000004653656520626974636f696' +
77
+ 'e2e6f72672f666562323020696620796f7520686176652074726f75626c652063' +
78
+ '6f6e6e656374696e6720616674657220323020466562727561727900473045022' +
79
+ '1008389df45f0703f39ec8c1cc42c13810ffcae14995bb648340219e353b63b53' +
80
+ 'eb022009ec65e1c1aaeec1fd334c6b684bde2b3f573060d5b70c3a46723326e4e' +
81
+ '8a4f1', 'hex')
82
+ var br = new BufferReader(buf)
83
+ var b1 = br.readVarLengthBuffer()
84
+ b1.toString('hex').should.equal('010000003766404f00000000b305434f000' +
85
+ '00000f2030000f1030000001027000048ee000000640000000046536565206269' +
86
+ '74636f696e2e6f72672f666562323020696620796f7520686176652074726f756' +
87
+ '26c6520636f6e6e656374696e6720616674657220323020466562727561727900')
88
+ var b2 = br.readVarLengthBuffer()
89
+ b2.toString('hex').should.equal('30450221008389df45f0703f39ec8c1cc42' +
90
+ 'c13810ffcae14995bb648340219e353b63b53eb022009ec65e1c1aaeec1fd334c' +
91
+ '6b684bde2b3f573060d5b70c3a46723326e4e8a4f1')
92
+ })
93
+ it('fails on length too big', function () {
94
+ var buf = Buffer.from('0a00', 'hex')
95
+ var br = new BufferReader(buf)
96
+ br.readVarLengthBuffer.bind(br).should.throw('Invalid length while reading varlength buffer')
97
+ })
98
+ })
99
+
100
+ describe('#readUInt8', function () {
101
+ it('should return 1', function () {
102
+ var buf = Buffer.alloc(1)
103
+ buf.writeUInt8(1, 0)
104
+ var br = new BufferReader(buf)
105
+ br.readUInt8().should.equal(1)
106
+ })
107
+ })
108
+
109
+ describe('#readUInt16BE', function () {
110
+ it('should return 1', function () {
111
+ var buf = Buffer.alloc(2)
112
+ buf.writeUInt16BE(1, 0)
113
+ var br = new BufferReader(buf)
114
+ br.readUInt16BE().should.equal(1)
115
+ })
116
+ })
117
+
118
+ describe('#readUInt16LE', function () {
119
+ it('should return 1', function () {
120
+ var buf = Buffer.alloc(2)
121
+ buf.writeUInt16LE(1, 0)
122
+ var br = new BufferReader(buf)
123
+ br.readUInt16LE().should.equal(1)
124
+ })
125
+ })
126
+
127
+ describe('#readUInt32BE', function () {
128
+ it('should return 1', function () {
129
+ var buf = Buffer.alloc(4)
130
+ buf.writeUInt32BE(1, 0)
131
+ var br = new BufferReader(buf)
132
+ br.readUInt32BE().should.equal(1)
133
+ })
134
+ })
135
+
136
+ describe('#readUInt32LE', function () {
137
+ it('should return 1', function () {
138
+ var buf = Buffer.alloc(4)
139
+ buf.writeUInt32LE(1, 0)
140
+ var br = new BufferReader(buf)
141
+ br.readUInt32LE().should.equal(1)
142
+ })
143
+ })
144
+
145
+ describe('#readUInt64BEBN', function () {
146
+ it('should return 1', function () {
147
+ var buf = Buffer.alloc(8)
148
+ buf.fill(0)
149
+ buf.writeUInt32BE(1, 4)
150
+ var br = new BufferReader(buf)
151
+ br.readUInt64BEBN().toNumber().should.equal(1)
152
+ })
153
+
154
+ it('should return 2^64', function () {
155
+ var buf = Buffer.alloc(8)
156
+ buf.fill(0xff)
157
+ var br = new BufferReader(buf)
158
+ br.readUInt64BEBN().toNumber().should.equal(Math.pow(2, 64))
159
+ })
160
+ })
161
+
162
+ describe('#readUInt64LEBN', function () {
163
+ it('should return 1', function () {
164
+ var buf = Buffer.alloc(8)
165
+ buf.fill(0)
166
+ buf.writeUInt32LE(1, 0)
167
+ var br = new BufferReader(buf)
168
+ br.readUInt64LEBN().toNumber().should.equal(1)
169
+ })
170
+
171
+ it('should return 10 BSV', function () {
172
+ var tenbsv = 10 * 1e8
173
+ var tenbsvBuffer = Buffer.from('00ca9a3b00000000', 'hex')
174
+ var br = new BufferReader(tenbsvBuffer)
175
+ br.readUInt64LEBN().toNumber().should.equal(tenbsv)
176
+ })
177
+
178
+ it('should return 2^30', function () {
179
+ var buf = Buffer.alloc(8)
180
+ buf.fill(0)
181
+ buf.writeUInt32LE(Math.pow(2, 30), 0)
182
+ var br = new BufferReader(buf)
183
+ br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 30))
184
+ })
185
+
186
+ it('should return 2^32 + 1', function () {
187
+ var num = Math.pow(2, 32) + 1
188
+ var numBuffer = Buffer.from('0100000001000000', 'hex')
189
+ var br = new BufferReader(numBuffer)
190
+ br.readUInt64LEBN().toNumber().should.equal(num)
191
+ })
192
+
193
+ it('should return max number of satoshis', function () {
194
+ var maxSatoshis = 21000000 * 1e8
195
+ var maxSatoshisBuffer = Buffer.from('0040075af0750700', 'hex')
196
+ var br = new BufferReader(maxSatoshisBuffer)
197
+ br.readUInt64LEBN().toNumber().should.equal(maxSatoshis)
198
+ })
199
+
200
+ it('should return 2^53 - 1', function () {
201
+ var maxSafe = Math.pow(2, 53) - 1
202
+ var maxSafeBuffer = Buffer.from('ffffffffffff1f00', 'hex')
203
+ var br = new BufferReader(maxSafeBuffer)
204
+ br.readUInt64LEBN().toNumber().should.equal(maxSafe)
205
+ })
206
+
207
+ it('should return 2^53', function () {
208
+ var bn = new BN('20000000000000', 16)
209
+ var bnBuffer = Buffer.from('0000000000002000', 'hex')
210
+ var br = new BufferReader(bnBuffer)
211
+ var readbn = br.readUInt64LEBN()
212
+ readbn.cmp(bn).should.equal(0)
213
+ })
214
+
215
+ it('should return 0', function () {
216
+ var buf = Buffer.alloc(8)
217
+ buf.fill(0)
218
+ var br = new BufferReader(buf)
219
+ br.readUInt64LEBN().toNumber().should.equal(0)
220
+ })
221
+
222
+ it('should return 2^64', function () {
223
+ var buf = Buffer.alloc(8)
224
+ buf.fill(0xff)
225
+ var br = new BufferReader(buf)
226
+ br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 64))
227
+ })
228
+ })
229
+
230
+ describe('#readVarintBuf', function () {
231
+ it('should read a 1 byte varint', function () {
232
+ var buf = Buffer.from([50])
233
+ var br = new BufferReader(buf)
234
+ br.readVarintBuf().length.should.equal(1)
235
+ })
236
+
237
+ it('should read a 3 byte varint', function () {
238
+ var buf = Buffer.from([253, 253, 0])
239
+ var br = new BufferReader(buf)
240
+ br.readVarintBuf().length.should.equal(3)
241
+ })
242
+
243
+ it('should read a 5 byte varint', function () {
244
+ var buf = Buffer.from([254, 0, 0, 0, 0])
245
+ buf.writeUInt32LE(50000, 1)
246
+ var br = new BufferReader(buf)
247
+ br.readVarintBuf().length.should.equal(5)
248
+ })
249
+
250
+ it('should read a 9 byte varint', function () {
251
+ var buf = BufferWriter().writeVarintBN(new BN(Math.pow(2, 54).toString())).concat()
252
+ var br = new BufferReader(buf)
253
+ br.readVarintBuf().length.should.equal(9)
254
+ })
255
+ })
256
+
257
+ describe('#readVarintNum', function () {
258
+ it('should read a 1 byte varint', function () {
259
+ var buf = Buffer.from([50])
260
+ var br = new BufferReader(buf)
261
+ br.readVarintNum().should.equal(50)
262
+ })
263
+
264
+ it('should read a 3 byte varint', function () {
265
+ var buf = Buffer.from([253, 253, 0])
266
+ var br = new BufferReader(buf)
267
+ br.readVarintNum().should.equal(253)
268
+ })
269
+
270
+ it('should read a 5 byte varint', function () {
271
+ var buf = Buffer.from([254, 0, 0, 0, 0])
272
+ buf.writeUInt32LE(50000, 1)
273
+ var br = new BufferReader(buf)
274
+ br.readVarintNum().should.equal(50000)
275
+ })
276
+
277
+ it('should throw an error on a 9 byte varint over the javascript uint precision limit', function () {
278
+ var buf = BufferWriter().writeVarintBN(new BN(Math.pow(2, 54).toString())).concat()
279
+ var br = new BufferReader(buf);
280
+ (function () {
281
+ br.readVarintNum()
282
+ }).should.throw('number too large to retain precision - use readVarintBN')
283
+ })
284
+
285
+ it('should not throw an error on a 9 byte varint not over the javascript uint precision limit', function () {
286
+ var buf = BufferWriter().writeVarintBN(new BN(Math.pow(2, 53).toString())).concat()
287
+ var br = new BufferReader(buf);
288
+ (function () {
289
+ br.readVarintNum()
290
+ }).should.not.throw('number too large to retain precision - use readVarintBN')
291
+ })
292
+ })
293
+
294
+ describe('#readVarintBN', function () {
295
+ it('should read a 1 byte varint', function () {
296
+ var buf = Buffer.from([50])
297
+ var br = new BufferReader(buf)
298
+ br.readVarintBN().toNumber().should.equal(50)
299
+ })
300
+
301
+ it('should read a 3 byte varint', function () {
302
+ var buf = Buffer.from([253, 253, 0])
303
+ var br = new BufferReader(buf)
304
+ br.readVarintBN().toNumber().should.equal(253)
305
+ })
306
+
307
+ it('should read a 5 byte varint', function () {
308
+ var buf = Buffer.from([254, 0, 0, 0, 0])
309
+ buf.writeUInt32LE(50000, 1)
310
+ var br = new BufferReader(buf)
311
+ br.readVarintBN().toNumber().should.equal(50000)
312
+ })
313
+
314
+ it('should read a 9 byte varint', function () {
315
+ var buf = Buffer.concat([Buffer.from([255]), Buffer.from('ffffffffffffffff', 'hex')])
316
+ var br = new BufferReader(buf)
317
+ br.readVarintBN().toNumber().should.equal(Math.pow(2, 64))
318
+ })
319
+ })
320
+
321
+ describe('#reverse', function () {
322
+ it('should reverse this [0, 1]', function () {
323
+ var buf = Buffer.from([0, 1])
324
+ var br = new BufferReader(buf)
325
+ br.reverse().readAll().toString('hex').should.equal('0100')
326
+ })
327
+ })
328
+ })
@@ -0,0 +1,160 @@
1
+ 'use strict'
2
+
3
+ var bsv = require('../..')
4
+ var should = require('chai').should()
5
+ var BufferWriter = bsv.encoding.BufferWriter
6
+ var BufferReader = bsv.encoding.BufferReader
7
+ var BN = bsv.crypto.BN
8
+
9
+ describe('BufferWriter', function () {
10
+ it('should create a new buffer writer', function () {
11
+ var bw = new BufferWriter()
12
+ should.exist(bw)
13
+ })
14
+
15
+ describe('#set', function () {
16
+ it('set bufs', function () {
17
+ var buf1 = Buffer.from([0])
18
+ var buf2 = Buffer.from([1])
19
+ var bw = new BufferWriter().set({ bufs: [buf1, buf2] })
20
+ bw.concat().toString('hex').should.equal('0001')
21
+ })
22
+ })
23
+
24
+ describe('#toBuffer', function () {
25
+ it('should concat these two bufs', function () {
26
+ var buf1 = Buffer.from([0])
27
+ var buf2 = Buffer.from([1])
28
+ var bw = new BufferWriter({ bufs: [buf1, buf2] })
29
+ bw.toBuffer().toString('hex').should.equal('0001')
30
+ })
31
+ })
32
+
33
+ describe('#concat', function () {
34
+ it('should concat these two bufs', function () {
35
+ var buf1 = Buffer.from([0])
36
+ var buf2 = Buffer.from([1])
37
+ var bw = new BufferWriter({ bufs: [buf1, buf2] })
38
+ bw.concat().toString('hex').should.equal('0001')
39
+ })
40
+ })
41
+
42
+ describe('#write', function () {
43
+ it('should write a buffer', function () {
44
+ var buf = Buffer.from([0])
45
+ var bw = new BufferWriter()
46
+ bw.write(buf)
47
+ bw.concat().toString('hex').should.equal('00')
48
+ })
49
+ })
50
+
51
+ describe('#writeUInt8', function () {
52
+ it('should write 1', function () {
53
+ var bw = new BufferWriter()
54
+ bw.writeUInt8(1).concat().toString('hex').should.equal('01')
55
+ })
56
+ })
57
+
58
+ describe('#writeUInt16BE', function () {
59
+ it('should write 1', function () {
60
+ var bw = new BufferWriter()
61
+ bw.writeUInt16BE(1).concat().toString('hex').should.equal('0001')
62
+ })
63
+ })
64
+
65
+ describe('#writeUInt16LE', function () {
66
+ it('should write 1', function () {
67
+ var bw = new BufferWriter()
68
+ bw.writeUInt16LE(1).concat().toString('hex').should.equal('0100')
69
+ })
70
+ })
71
+
72
+ describe('#writeUInt32BE', function () {
73
+ it('should write 1', function () {
74
+ var bw = new BufferWriter()
75
+ bw.writeUInt32BE(1).concat().toString('hex').should.equal('00000001')
76
+ })
77
+ })
78
+
79
+ describe('#writeUInt32LE', function () {
80
+ it('should write 1', function () {
81
+ var bw = new BufferWriter()
82
+ bw.writeUInt32LE(1).concat().toString('hex').should.equal('01000000')
83
+ })
84
+ })
85
+
86
+ describe('#writeUInt64BEBN', function () {
87
+ it('should write 1', function () {
88
+ var bw = new BufferWriter()
89
+ bw.writeUInt64BEBN(new BN(1)).concat().toString('hex').should.equal('0000000000000001')
90
+ })
91
+ })
92
+
93
+ describe('#writeUInt64LEBN', function () {
94
+ it('should write 1', function () {
95
+ var bw = new BufferWriter()
96
+ bw.writeUInt64LEBN(new BN(1)).concat().toString('hex').should.equal('0100000000000000')
97
+ })
98
+ })
99
+
100
+ describe('#writeVarint', function () {
101
+ it('should write a 1 byte varint', function () {
102
+ var bw = new BufferWriter()
103
+ bw.writeVarintNum(1)
104
+ bw.concat().length.should.equal(1)
105
+ })
106
+
107
+ it('should write a 3 byte varint', function () {
108
+ var bw = new BufferWriter()
109
+ bw.writeVarintNum(1000)
110
+ bw.concat().length.should.equal(3)
111
+ })
112
+
113
+ it('should write a 5 byte varint', function () {
114
+ var bw = new BufferWriter()
115
+ bw.writeVarintNum(Math.pow(2, 16 + 1))
116
+ bw.concat().length.should.equal(5)
117
+ })
118
+
119
+ it('should write a 9 byte varint', function () {
120
+ var bw = new BufferWriter()
121
+ bw.writeVarintNum(Math.pow(2, 32 + 1))
122
+ bw.concat().length.should.equal(9)
123
+ })
124
+
125
+ it('should read back the same value it wrote for a 9 byte varint', function () {
126
+ var bw = new BufferWriter()
127
+ var n = Math.pow(2, 53)
128
+ n.should.equal(n + 1) // javascript number precision limit
129
+ bw.writeVarintNum(n)
130
+ var br = new BufferReader({ buf: bw.concat() })
131
+ br.readVarintBN().toNumber().should.equal(n)
132
+ })
133
+ })
134
+
135
+ describe('#writeVarintBN', function () {
136
+ it('should write a 1 byte varint', function () {
137
+ var bw = new BufferWriter()
138
+ bw.writeVarintBN(new BN(1))
139
+ bw.concat().length.should.equal(1)
140
+ })
141
+
142
+ it('should write a 3 byte varint', function () {
143
+ var bw = new BufferWriter()
144
+ bw.writeVarintBN(new BN(1000))
145
+ bw.concat().length.should.equal(3)
146
+ })
147
+
148
+ it('should write a 5 byte varint', function () {
149
+ var bw = new BufferWriter()
150
+ bw.writeVarintBN(new BN(Math.pow(2, 16 + 1)))
151
+ bw.concat().length.should.equal(5)
152
+ })
153
+
154
+ it('should write a 9 byte varint', function () {
155
+ var bw = new BufferWriter()
156
+ bw.writeVarintBN(new BN(Math.pow(2, 32 + 1)))
157
+ bw.concat().length.should.equal(9)
158
+ })
159
+ })
160
+ })