UNPKG

multichain-address-validator

Version:

Multichain address validator for Bitcoin and other blockchains.

53 lines (52 loc) 2.25 kB
"use strict"; 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); } });