multichain-address-validator
Version:
Multichain address validator for Bitcoin and other blockchains.
129 lines (128 loc) • 4.21 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const buffer_1 = require("buffer");
const sha256_1 = require("@noble/hashes/sha256");
const sha512_1 = require("@noble/hashes/sha512");
const utils_1 = require("@noble/hashes/utils");
const sha3_1 = require("@noble/hashes/sha3");
const base32_js_1 = __importDefault(require("./base32.js"));
const base58_js_1 = __importDefault(require("./base58.js"));
const blake256_js_1 = __importDefault(require("./blake256.js"));
const blake2b_js_1 = __importDefault(require("./blake2b.js"));
function numberToHex(number, length) {
let hex = number.toString(16);
if (hex.length % 2 === 1) {
hex = '0' + hex;
}
return hex.padStart(length, '0');
}
function isHexChar(c) {
if ((c >= 'A' && c <= 'F') ||
(c >= 'a' && c <= 'f') ||
(c >= '0' && c <= '9')) {
return 1;
}
return 0;
}
/* Convert a hex char to value */
function hexChar2byte(c) {
let d = 0;
if (c >= 'A' && c <= 'F') {
d = c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;
}
else if (c >= 'a' && c <= 'f') {
d = c.charCodeAt(0) - 'a'.charCodeAt(0) + 10;
}
else if (c >= '0' && c <= '9') {
d = c.charCodeAt(0) - '0'.charCodeAt(0);
}
return d;
}
/* Convert a byte to string */
function byte2hexStr(byte) {
const hexByteMap = "0123456789ABCDEF";
let str = "";
str += hexByteMap.charAt(byte >> 4);
str += hexByteMap.charAt(byte & 0x0f);
return str;
}
function byteArray2hexStr(byteArray) {
let str = "";
let i = 0;
for (i = 0; i < (byteArray.length - 1); i++) {
str += byte2hexStr(byteArray[i]);
}
str += byte2hexStr(byteArray[i]);
return str;
}
function hexStr2byteArray(str) {
const byteArray = new Uint8Array(str.length / 2);
let d = 0;
let i = 0;
let j = 0;
let k = 0;
for (i = 0; i < str.length; i++) {
const c = str.charAt(i);
if (isHexChar(c)) {
d <<= 4;
d += hexChar2byte(c);
j++;
if (0 === (j % 2)) {
byteArray[k++] = d;
d = 0;
}
}
}
return byteArray;
}
exports.default = {
numberToHex: numberToHex,
toHex: function (arrayOfBytes) {
let hex = '';
for (let i = 0; i < arrayOfBytes.length; i++) {
// @ts-expect-error
hex += numberToHex(arrayOfBytes[i]);
}
return hex;
},
sha256: function (payload, format = 'HEX') {
return (0, utils_1.bytesToHex)((0, sha256_1.sha256)(hexStr2byteArray(payload)));
},
sha256x2: function (buffer, format = 'HEX') {
return this.sha256(this.sha256(buffer, format), format);
},
sha256Checksum: function (payload) {
return this.sha256(this.sha256(payload)).slice(0, 8);
},
sha512: function (payload, format = 'HEX') {
return (0, utils_1.bytesToHex)((0, sha512_1.sha512)(payload));
},
sha512_256: function (payload, format = 'HEX') {
return (0, utils_1.bytesToHex)((0, sha512_1.sha512_256)(hexStr2byteArray(payload)));
},
blake256: function (hexString) {
return new blake256_js_1.default().update(hexString, 'hex').digest('hex');
},
blake256Checksum: function (payload) {
return this.blake256(this.blake256(payload)).substr(0, 8);
},
blake2b: function (hexString, outlen) {
return new blake2b_js_1.default(outlen).update(buffer_1.Buffer.from(hexString, 'hex')).digest('hex');
},
keccak256: function (hexString) {
return (0, utils_1.bytesToHex)((0, sha3_1.keccak_256)(hexString));
},
keccak256Checksum: function (payload) {
return this.keccak256(payload).toString().substr(0, 8);
},
blake2b256: function (hexString) {
return new blake2b_js_1.default(32).update(buffer_1.Buffer.from(hexString, 'hex')).digest('hex');
},
base58: base58_js_1.default.decode,
byteArray2hexStr: byteArray2hexStr,
hexStr2byteArray: hexStr2byteArray,
base32: base32_js_1.default
};