multichain-address-validator
Version:
Multichain address validator for Bitcoin and other blockchains.
53 lines (52 loc) • 2.25 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const base58_js_1 = __importDefault(require("../crypto/base58.js"));
const utils_js_1 = __importDefault(require("../crypto/utils.js"));
const types_js_1 = require("../types.js");
const helpers_js_1 = require("../helpers.js");
function getDecoded(address) {
try {
return base58_js_1.default.decode(address);
}
catch (e) {
// if decoding fails, assume invalid address
return null;
}
}
function getChecksum(payload) {
return utils_js_1.default.sha256Checksum(payload);
}
function isValidTransparentAddress(address, networkType) {
// Zcash transparent addresses use 2-byte version prefixes
// Expected length: 26 bytes (2 bytes version + 20 bytes payload + 4 bytes checksum)
const expectedLength = 26;
const decoded = getDecoded(address);
if (!decoded || decoded.length !== expectedLength) {
return false;
}
const checksum = utils_js_1.default.toHex(decoded.slice(expectedLength - 4, expectedLength));
const body = utils_js_1.default.toHex(decoded.slice(0, expectedLength - 4));
const goodChecksum = getChecksum(body);
if (checksum !== goodChecksum) {
return false;
}
// Get the 2-byte version prefix
const versionPrefix = utils_js_1.default.toHex(decoded.slice(0, 2));
// Define valid version prefixes for each network
// Only supporting transparent addresses (t1/t3 for mainnet, tm/t2 for testnet)
const validPrefixes = networkType === types_js_1.NetworkType.MainNet
? ['1cb8', '1cbd'] // t1 (P2PKH) and t3 (P2SH) for mainnet
: ['1d25', '1cba']; // tm (P2PKH) and t2 (P2SH) for testnet
return validPrefixes.includes(versionPrefix);
}
exports.default = (networkType) => ({
isValidAddress(address) {
const addr = (0, helpers_js_1.getAddress)(address);
// Only validate transparent addresses (t1/t3 for mainnet, tm/t2 for testnet)
// Sapling (zs) and Unified (u) addresses are NOT supported
return isValidTransparentAddress(addr, networkType);
}
});