@benev/slate
Version:
frontend web stuff
58 lines (55 loc) • 1.81 kB
JavaScript
/*
256-bit base58 ids look like this:
9X1D9rdkDgRdykzmogNcxfopRc7TnbS869ow1E2ehCFS
AmRKyNfq6jhhsd9qda1Y6rAVS2NLUqyTUvfcB2wUiiAC
8skYcqBAXsejDcJzsZMo19PErt43DHP3bykaXBtMvdu
*/
import { Hex } from "./hex.js";
import { Bytes } from "./bytes.js";
const base = 58;
const characters = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
export const Base58 = Object.freeze({
string(bytes) {
let intVal = BigInt("0x" + Hex.string(bytes));
let encoded = "";
while (intVal > 0) {
const remainder = intVal % BigInt(base);
intVal = intVal / BigInt(base);
encoded = characters[Number(remainder)] + encoded;
}
for (const byte of bytes) {
if (byte === 0)
encoded = characters[0] + encoded;
else
break;
}
return encoded;
},
bytes(string) {
let intVal = BigInt(0);
for (const char of string) {
const index = characters.indexOf(char);
if (index === -1)
throw new Error(`Invalid character '${char}' in base58 string`);
intVal = intVal * BigInt(base) + BigInt(index);
}
let hex = intVal.toString(16);
if (hex.length % 2 !== 0)
hex = "0" + hex;
const bytes = Hex.bytes(hex);
let leadingZeroes = 0;
for (const char of string) {
if (char === characters[0])
leadingZeroes++;
else
break;
}
const decoded = new Uint8Array(leadingZeroes + bytes.length);
decoded.set(bytes, leadingZeroes);
return decoded;
},
random(count = 32) {
return this.string(Bytes.random(count));
},
});
//# sourceMappingURL=base58.js.map