@massalabs/massa-web3
Version:
massa's web3 sdk client
131 lines • 5.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.numberToInteger = exports.integerFromByte = exports.integerToByte = void 0;
const __1 = require("..");
function mustBeValidSigned(sizeInBits, value) {
const min = -(1n << (BigInt(sizeInBits) - 1n));
const max = (1n << (BigInt(sizeInBits) - 1n)) - 1n;
if (value < min || value > max) {
throw new Error(`value ${value} is out of range for an I${sizeInBits}.`);
}
}
function mustBeValidUnsigned(sizeInBits, value) {
if (value < 0n) {
throw new Error("negative value can't be serialized as unsigned integer.");
}
if (value >= 1n << BigInt(sizeInBits)) {
throw new Error(`value ${value} is too large for an U${sizeInBits}.`);
}
}
function integerToByte(sizeInBits, value, signed = false) {
signed
? mustBeValidSigned(sizeInBits, value)
: mustBeValidUnsigned(sizeInBits, value);
const buffer = new ArrayBuffer(sizeInBits / __1.U8.SIZE_BIT);
const view = new DataView(buffer);
switch (sizeInBits) {
case __1.U8.SIZE_BIT:
signed ? view.setInt8(0, Number(value)) : view.setUint8(0, Number(value));
break;
case __1.U16.SIZE_BIT:
signed
? view.setInt16(0, Number(value), true)
: view.setUint16(0, Number(value), true);
break;
case __1.U32.SIZE_BIT:
signed
? view.setInt32(0, Number(value), true)
: view.setUint32(0, Number(value), true);
break;
case __1.U64.SIZE_BIT:
signed
? view.setBigInt64(0, value, true)
: view.setBigUint64(0, value, true);
break;
case __1.U128.SIZE_BIT:
setBigUint128(view, value);
break;
case __1.U256.SIZE_BIT:
setBigUint256(view, value);
break;
default:
throw new Error(`unsupported ${signed ? 'I' : 'U'}${sizeInBits} serialization.`);
}
return new Uint8Array(view.buffer);
}
exports.integerToByte = integerToByte;
function integerFromByte(sizeInBits, bytes, signed = false, index = 0) {
if (bytes.length < index + sizeInBits / __1.U8.SIZE_BIT) {
throw new Error('not enough bytes to read the value.');
}
const view = new DataView(bytes.buffer);
switch (sizeInBits) {
case __1.U8.SIZE_BIT:
return signed ? BigInt(view.getInt8(index)) : BigInt(view.getUint8(index));
case __1.U16.SIZE_BIT:
return signed
? BigInt(view.getInt16(index, true))
: BigInt(view.getUint16(index, true));
case __1.U32.SIZE_BIT:
return signed
? BigInt(view.getInt32(index, true))
: BigInt(view.getUint32(index, true));
case __1.U64.SIZE_BIT:
return signed
? view.getBigInt64(index, true)
: view.getBigUint64(index, true);
case __1.U128.SIZE_BIT:
return signed ? getBigInt128(view, index) : getBigUint128(view, index);
case __1.U256.SIZE_BIT:
return signed ? getBigInt256(view, index) : getBigUint256(view, index);
default:
throw new Error(`unsupported ${signed ? 'I' : 'U'}${sizeInBits} deserialization`);
}
}
exports.integerFromByte = integerFromByte;
function numberToInteger(sizeInBits, value, signed = false) {
if (typeof value === 'number' && !Number.isSafeInteger(value)) {
throw new Error(`value ${value} is not a safe integer.`);
}
const int = BigInt(value);
signed
? mustBeValidSigned(sizeInBits, int)
: mustBeValidUnsigned(sizeInBits, int);
return int;
}
exports.numberToInteger = numberToInteger;
function setBigUint128(view, value) {
const offset = 0;
view.setBigUint64(offset, value & __1.U64.MAX, true);
view.setBigUint64(offset + __1.U64.SIZE_BYTE, value >> BigInt(__1.U64.SIZE_BIT), true);
}
function getBigUint128(view, offset) {
const low = view.getBigUint64(offset, true);
offset += __1.U64.SIZE_BYTE;
const high = view.getBigUint64(offset, true);
return (high << BigInt(__1.U64.SIZE_BIT)) | low;
}
function setBigUint256(view, value) {
let offset = 0;
for (let i = 0; i < __1.U256.SIZE_BYTE / __1.U64.SIZE_BYTE; i++) {
view.setBigUint64(offset, value & __1.U64.MAX, true);
offset += __1.U64.SIZE_BYTE;
value >>= BigInt(__1.U64.SIZE_BIT);
}
}
function getBigUint256(view, offset) {
let result = 0n;
const nbParts = __1.U256.SIZE_BYTE / __1.U64.SIZE_BYTE;
for (let i = 0; i < nbParts; i++) {
const part = view.getBigUint64(offset + i * __1.U64.SIZE_BYTE, true);
result = result | (part << BigInt(i * __1.U64.SIZE_BIT));
}
return result;
}
function getBigInt128(view, offset) {
return BigInt.asIntN(__1.U128.SIZE_BIT, getBigUint128(view, offset));
}
function getBigInt256(view, offset) {
return BigInt.asIntN(__1.U256.SIZE_BIT, getBigUint256(view, offset));
}
//# sourceMappingURL=integers.js.map