const ethUtil = require('ethereumjs-util') var valueTable = { wei: '1000000000000000000', kwei: '1000000000000000', mwei: '1000000000000', gwei: '1000000000', szabo: '1000000', finney:'1000', ether: '1', kether:'0.001', mether:'0.000001', gether:'0.000000001', tether:'0.000000000001', } var bnTable = {} for (var currency in valueTable) { bnTable[currency] = new ethUtil.BN(valueTable[currency], 10) } module.exports = { valuesFor: valuesFor, addressSummary: addressSummary, isAllOneCase: isAllOneCase, isValidAddress: isValidAddress, numericBalance: numericBalance, parseBalance: parseBalance, formatBalance: formatBalance, dataSize: dataSize, readableDate: readableDate, ethToWei: ethToWei, weiToEth: weiToEth, normalizeToWei: normalizeToWei, normalizeNumberToWei: normalizeNumberToWei, valueTable: valueTable, bnTable: bnTable, } function valuesFor(obj) { if (!obj) return [] return Object.keys(obj) .map(function(key){ return obj[key] }) } function addressSummary(address) { var checked = ethUtil.toChecksumAddress(address) return checked ? checked.slice(0,2+8)+'...'+checked.slice(-4) : '...' } function isValidAddress(address) { var prefixed = ethUtil.addHexPrefix(address) return isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed) || ethUtil.isValidChecksumAddress(prefixed) } function isAllOneCase(address) { var lower = address.toLowerCase() var upper = address.toUpperCase() return address === lower || address === upper } // Takes wei Hex, returns wei BN, even if input is null function numericBalance(balance) { if (!balance) return new ethUtil.BN(0, 16) var stripped = ethUtil.stripHexPrefix(balance) return new ethUtil.BN(stripped, 16) } // Takes eth BN, returns BN wei function ethToWei(bn) { var eth = new ethUtil.BN('1000000000000000000') var wei = bn.mul(eth) return wei } // Takes BN in Wei, returns BN in eth function weiToEth(bn) { var diff = new ethUtil.BN('1000000000000000000') var eth = bn.div(diff) return eth } // Takes hex, returns [beforeDecimal, afterDecimal] function parseBalance(balance, decimalsToKeep) { if (decimalsToKeep === undefined) decimalsToKeep = 4 if (!balance || balance === '0x0') return ['0', ''] var wei = numericBalance(balance) var padded = wei.toString(10) var len = padded.length var match = padded.match(/[^0]/) var nonZeroIndex = match && match.index var beforeDecimal = padded.substr(nonZeroIndex ? nonZeroIndex : 0, len - 18) || '0' var afterDecimal = padded.substr(len - 18, decimalsToKeep) return [beforeDecimal, afterDecimal] } // Takes wei hex, returns "None" or "${formattedAmount} ETH" function formatBalance(balance) { var parsed = parseBalance(balance) var beforeDecimal = parsed[0] var afterDecimal = parsed[1] if (beforeDecimal === '0' && afterDecimal === '') return 'None' var result = beforeDecimal if (afterDecimal) result += '.'+afterDecimal result += ' ETH' return result } function dataSize(data) { var size = data ? ethUtil.stripHexPrefix(data).length : 0 return size+' bytes' } // Takes a BN and an ethereum currency name, // returns a BN in wei function normalizeToWei(amount, currency) { try { return amount.mul(bnTable.wei).div(bnTable[currency]) } catch (e) {} return amount } var multiple = new ethUtil.BN('1000', 10) function normalizeNumberToWei(n, currency) { var enlarged = n * 1000 var amount = new ethUtil.BN(String(enlarged), 10) return normalizeToWei(amount, currency).div(multiple) } function readableDate(ms) { var date = new Date(ms) var month = date.getMonth() var day = date.getDate() var year = date.getFullYear() var hours = date.getHours() var minutes = "0" + date.getMinutes() var seconds = "0" + date.getSeconds() var date = `${month}/${day}/${year}` var time = `${hours}:${minutes.substr(-2)}:${seconds.substr(-2)}` return `${date} ${time}` }