UNPKG

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