UNPKG

@fordefi-public/crypto-address-validator-ts

Version:

Crypto address validator for Bitcoin and other Altcoins, forked to be used with typescript

54 lines 2.13 kB
import { keccak256Checksum } from '../crypto/utils'; var cnBase58 = require('../crypto/externals/cnBase58'); var DEFAULT_NETWORK_TYPE = 'prod'; var addressRegTest = new RegExp('^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{95}$'); var integratedAddressRegTest = new RegExp('^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{106}$'); function validateNetwork(decoded, currency, networkType, addressType) { var network = currency.addressTypes; if (addressType == 'integrated') { network = currency.iAddressTypes; } var at = parseInt(decoded.substr(0, 2), 16).toString(); switch (networkType) { case 'prod': return network.prod.indexOf(at) >= 0; case 'testnet': return network.testnet.indexOf(at) >= 0; case 'stagenet': return network.stagenet.indexOf(at) >= 0; case 'both': return network.prod.indexOf(at) >= 0 || network.testnet.indexOf(at) >= 0 || network.stagenet.indexOf(at) >= 0; default: return false; } } function hextobin(hex) { if (hex.length % 2 !== 0) return null; var res = new Uint8Array(hex.length / 2); for (var i = 0; i < hex.length / 2; ++i) { res[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16); } return res; } export function isValidAddress(address, currency, opts) { var networkType = opts ? (opts.networkType || DEFAULT_NETWORK_TYPE) : DEFAULT_NETWORK_TYPE; var addressType = 'standard'; if (!addressRegTest.test(address)) { if (integratedAddressRegTest.test(address)) { addressType = 'integrated'; } else { return false; } } var decodedAddrStr = cnBase58.decode(address); if (!decodedAddrStr) return false; if (!validateNetwork(decodedAddrStr, currency, networkType, addressType)) return false; var addrChecksum = decodedAddrStr.slice(-8); var hashChecksum = keccak256Checksum(hextobin(decodedAddrStr.slice(0, -8))); return addrChecksum === hashChecksum; } //# sourceMappingURL=xmr_validator.js.map