/* @flow */ import BigNumber from 'bignumber.js'; import EthereumjsUtil from 'ethereumjs-util'; export const decimalToHex = (dec: number): string => new BigNumber(dec).toString(16); export const padLeftEven = (hex: string): string => (hex.length % 2 !== 0 ? `0${hex}` : hex); export const sanitizeHex = ($hex: string): string => { const hex = $hex.toLowerCase().substring(0, 2) === '0x' ? $hex.substring(2) : $hex; if (hex === '') return ''; return `0x${padLeftEven(hex)}`; }; export const hexToDecimal = (hex: number): string => { const sanitized: ?string = sanitizeHex(hex.toString()); return !sanitized ? 'null' : new BigNumber(sanitized).toString(); }; export const strip = (str: string): string => { if (str.indexOf('0x') === 0) { return padLeftEven(str.substring(2, str.length)); } return padLeftEven(str); }; export const calcGasPrice = (price: BigNumber, limit: string): string => price.times(limit).toString(); export const validateAddress = (address: string): ?string => { const hasUpperCase = new RegExp('^(.*[A-Z].*)$'); if (address.length < 1) { return 'Address is not set'; } if (!EthereumjsUtil.isValidAddress(address)) { return 'Address is not valid'; } if (address.match(hasUpperCase) && !EthereumjsUtil.isValidChecksumAddress(address)) { return 'Address is not a valid checksum'; } return null; }; export const isHex = (str: string): boolean => { const regExp = /^(0x|0X)?[0-9A-Fa-f]+$/g; return regExp.test(str); }; export const hasUppercase = (value: string) => { const UPPERCASE_RE = new RegExp('^(.*[A-Z].*)$'); return UPPERCASE_RE.test(value); }; export const isEthereumNumber = (value: string, decimals: number = 18) => { const ETH_18_RE = new RegExp( `^(0|0\\.([0-9]{0,${decimals}})?|[1-9][0-9]*\\.?([0-9]{0,${decimals}})?)$` ); return ETH_18_RE.test(value); };