1 | 'use strict';
|
2 | Object.defineProperty(exports, '__esModule', { value: true });
|
3 | function 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 |
|
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 |
|
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 | }
|
31 | exports.decode = decode;
|
32 | function 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 | }
|
45 | function 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 | }
|
61 | exports.encode = encode;
|