UNPKG

1.63 kBJavaScriptView Raw
1'use strict';
2Object.defineProperty(exports, '__esModule', { value: true });
3function decode(buffer, maxLength, minimal) {
4 maxLength = maxLength || 4;
5 minimal = minimal === undefined ? true : minimal;
6 const length = buffer.length;
7 if (length === 0) return 0;
8 if (length > maxLength) throw new TypeError('Script number overflow');
9 if (minimal) {
10 if ((buffer[length - 1] & 0x7f) === 0) {
11 if (length <= 1 || (buffer[length - 2] & 0x80) === 0)
12 throw new Error('Non-minimally encoded script number');
13 }
14 }
15 // 40-bit
16 if (length === 5) {
17 const a = buffer.readUInt32LE(0);
18 const b = buffer.readUInt8(4);
19 if (b & 0x80) return -((b & ~0x80) * 0x100000000 + a);
20 return b * 0x100000000 + a;
21 }
22 // 32-bit / 24-bit / 16-bit / 8-bit
23 let result = 0;
24 for (let i = 0; i < length; ++i) {
25 result |= buffer[i] << (8 * i);
26 }
27 if (buffer[length - 1] & 0x80)
28 return -(result & ~(0x80 << (8 * (length - 1))));
29 return result;
30}
31exports.decode = decode;
32function scriptNumSize(i) {
33 return i > 0x7fffffff
34 ? 5
35 : i > 0x7fffff
36 ? 4
37 : i > 0x7fff
38 ? 3
39 : i > 0x7f
40 ? 2
41 : i > 0x00
42 ? 1
43 : 0;
44}
45function encode(_number) {
46 let value = Math.abs(_number);
47 const size = scriptNumSize(value);
48 const buffer = Buffer.allocUnsafe(size);
49 const negative = _number < 0;
50 for (let i = 0; i < size; ++i) {
51 buffer.writeUInt8(value & 0xff, i);
52 value >>= 8;
53 }
54 if (buffer[size - 1] & 0x80) {
55 buffer.writeUInt8(negative ? 0x80 : 0x00, size - 1);
56 } else if (negative) {
57 buffer[size - 1] |= 0x80;
58 }
59 return buffer;
60}
61exports.encode = encode;