@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
JavaScript
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