UNPKG

2.99 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.u8aToBigInt = void 0;
4const x_bigint_1 = require("@polkadot/x-bigint");
5const consts_js_1 = require("../bi/consts.js");
6const U8_MAX = (0, x_bigint_1.BigInt)(256);
7const U16_MAX = (0, x_bigint_1.BigInt)(256 * 256);
8const U64_MAX = (0, x_bigint_1.BigInt)('0x10000000000000000');
9/**
10 * @name u8aToBigInt
11 * @summary Creates a BigInt from a Uint8Array object.
12 */
13function u8aToBigInt(value, { isLe = true, isNegative = false } = {}) {
14 // slice + reverse is expensive, however SCALE is LE by default so this is the path
15 // we are most interested in (the BE is added for the sake of being comprehensive)
16 if (!isLe) {
17 value = value.slice().reverse();
18 }
19 const count = value.length;
20 if (isNegative && count && (value[count - 1] & 0x80)) {
21 switch (count) {
22 case 0:
23 return (0, x_bigint_1.BigInt)(0);
24 case 1:
25 return (0, x_bigint_1.BigInt)(((value[0] ^ 255) * -1) - 1);
26 case 2:
27 return (0, x_bigint_1.BigInt)((((value[0] + (value[1] << 8)) ^ 65535) * -1) - 1);
28 case 4:
29 return (0, x_bigint_1.BigInt)((((value[0] + (value[1] << 8) + (value[2] << 16) + (value[3] * 16777216)) ^ 4294967295) * -1) - 1);
30 }
31 const dvI = new DataView(value.buffer, value.byteOffset);
32 if (count === 8) {
33 return dvI.getBigInt64(0, true);
34 }
35 let result = (0, x_bigint_1.BigInt)(0);
36 const mod = count % 2;
37 for (let i = count - 2; i >= mod; i -= 2) {
38 result = (result * U16_MAX) + (0, x_bigint_1.BigInt)(dvI.getUint16(i, true) ^ 0xffff);
39 }
40 if (mod) {
41 result = (result * U8_MAX) + (0, x_bigint_1.BigInt)(value[0] ^ 0xff);
42 }
43 return (result * -consts_js_1._1n) - consts_js_1._1n;
44 }
45 switch (count) {
46 case 0:
47 return (0, x_bigint_1.BigInt)(0);
48 case 1:
49 return (0, x_bigint_1.BigInt)(value[0]);
50 case 2:
51 return (0, x_bigint_1.BigInt)(value[0] + (value[1] << 8));
52 case 4:
53 return (0, x_bigint_1.BigInt)(value[0] + (value[1] << 8) + (value[2] << 16) + (value[3] * 16777216));
54 }
55 const dvI = new DataView(value.buffer, value.byteOffset);
56 switch (count) {
57 case 8:
58 return dvI.getBigUint64(0, true);
59 case 16:
60 return (dvI.getBigUint64(8, true) * U64_MAX) + dvI.getBigUint64(0, true);
61 default: {
62 let result = (0, x_bigint_1.BigInt)(0);
63 const mod = count % 2;
64 for (let i = count - 2; i >= mod; i -= 2) {
65 result = (result * U16_MAX) + (0, x_bigint_1.BigInt)(dvI.getUint16(i, true));
66 }
67 if (mod) {
68 result = (result * U8_MAX) + (0, x_bigint_1.BigInt)(value[0]);
69 }
70 return result;
71 }
72 }
73}
74exports.u8aToBigInt = u8aToBigInt;