@lodestar/utils
Version:
Utilities required across multiple lodestar packages
73 lines • 2.52 kB
JavaScript
// "0".charCodeAt(0) = 48
const CHAR_CODE_0 = 48;
// "x".charCodeAt(0) = 120
const CHAR_CODE_X = 120;
export function toHex(bytes) {
const charCodes = new Array(bytes.length * 2 + 2);
charCodes[0] = CHAR_CODE_0;
charCodes[1] = CHAR_CODE_X;
bytesIntoCharCodes(bytes, charCodes);
return String.fromCharCode(...charCodes);
}
const rootCharCodes = new Array(32 * 2 + 2);
rootCharCodes[0] = CHAR_CODE_0;
rootCharCodes[1] = CHAR_CODE_X;
/**
* Convert a Uint8Array, length 32, to 0x-prefixed hex string
*/
export function toRootHex(root) {
if (root.length !== 32) {
throw Error(`Expect root to be 32 bytes, got ${root.length}`);
}
bytesIntoCharCodes(root, rootCharCodes);
return String.fromCharCode(...rootCharCodes);
}
const pubkeyCharCodes = new Array(48 * 2 + 2);
pubkeyCharCodes[0] = CHAR_CODE_0;
pubkeyCharCodes[1] = CHAR_CODE_X;
/**
* Convert a Uint8Array, length 48, to 0x-prefixed hex string
*/
export function toPubkeyHex(pubkey) {
if (pubkey.length !== CHAR_CODE_0) {
throw Error(`Expect pubkey to be 48 bytes, got ${pubkey.length}`);
}
bytesIntoCharCodes(pubkey, pubkeyCharCodes);
return String.fromCharCode(...pubkeyCharCodes);
}
export function fromHex(hex) {
if (typeof hex !== "string") {
throw new Error(`hex argument type ${typeof hex} must be of type string`);
}
if (hex.startsWith("0x")) {
hex = hex.slice(2);
}
if (hex.length % 2 !== 0) {
throw new Error(`hex string length ${hex.length} must be multiple of 2`);
}
const byteLen = hex.length / 2;
const bytes = new Uint8Array(byteLen);
for (let i = 0; i < byteLen; i++) {
const byte = parseInt(hex.slice(i * 2, (i + 1) * 2), 16);
bytes[i] = byte;
}
return bytes;
}
/**
* Populate charCodes from bytes. Note that charCodes index 0 and 1 ("0x") are not populated.
*/
function bytesIntoCharCodes(bytes, charCodes) {
if (bytes.length * 2 + 2 !== charCodes.length) {
throw Error(`Expect charCodes to be of length ${bytes.length * 2 + 2}, got ${charCodes.length}`);
}
for (let i = 0; i < bytes.length; i++) {
const byte = bytes[i];
const first = (byte & 0xf0) >> 4;
const second = byte & 0x0f;
// "0".charCodeAt(0) = 48
// "a".charCodeAt(0) = 97 => delta = 87
charCodes[2 + 2 * i] = first < 10 ? first + 48 : first + 87;
charCodes[2 + 2 * i + 1] = second < 10 ? second + 48 : second + 87;
}
}
//# sourceMappingURL=browser.js.map