// Copyright 2015, 2016 Ethcore (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Parity is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Parity. If not, see . import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase export function isChecksumValid (_address) { const address = _address.replace('0x', ''); const hash = keccak_256(address.toLowerCase(address)); for (let n = 0; n < 40; n++) { const hashval = parseInt(hash[n], 16); const isLower = address[n].toUpperCase() !== address[n]; const isUpper = address[n].toLowerCase() !== address[n]; if ((hashval > 7 && isLower) || (hashval <= 7 && isUpper)) { return false; } } return true; } export function isAddress (address) { if (address && address.length === 42) { if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) { return false; } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) { return true; } return isChecksumValid(address); } return false; } export function toChecksumAddress (_address) { const address = (_address || '').toLowerCase(); if (!isAddress(address)) { return ''; } const hash = keccak_256(address.slice(-40)); let result = '0x'; for (let n = 0; n < 40; n++) { result = `${result}${parseInt(hash[n], 16) > 7 ? address[n + 2].toUpperCase() : address[n + 2]}`; } return result; }