diff --git a/FromExponential.js b/FromExponential.js new file mode 100644 index 0000000..2a1b91d --- /dev/null +++ b/FromExponential.js @@ -0,0 +1,33 @@ +// src: https://gist.github.com/jiggzson/b5f489af9ad931e3d186 +const SCIENTIFIC_NUMBER_REGEX = /\d+\.?\d*e[\+\-]*\d+/i; + +// Convert from scientific notation into a number +// e.g. from 9.99998934104e+21 to 9999989341040000000000 +const scientificToDecimal = function(number) { + let numberHasSign = number.startsWith("-") || number.startsWith("+"); + let sign = numberHasSign ? number[0] : ""; + number = numberHasSign ? number.replace(sign, "") : number; + + //if the number is in scientific notation remove it + if (SCIENTIFIC_NUMBER_REGEX.test(number)) { + let zero = '0'; + let parts = String(number).toLowerCase().split('e'); //split into coeff and exponent + let e = parts.pop();//store the exponential part + let l = Math.abs(e); //get the number of zeros + let sign = e / l; + let coeff_array = parts[0].split('.'); + + if (sign === -1) { + coeff_array[0] = Math.abs(coeff_array[0]); + number = zero + '.' + new Array(l).join(zero) + coeff_array.join(''); + } else { + let dec = coeff_array[1]; + if (dec) l = l - dec.length; + number = coeff_array.join('') + new Array(l + 1).join(zero); + } + } + + return `${sign}${number}`; +}; + +module.exports = scientificToDecimal; \ No newline at end of file diff --git a/RemoteMetaMaskProvider.js b/RemoteMetaMaskProvider.js index e843fa8..3916e8f 100644 --- a/RemoteMetaMaskProvider.js +++ b/RemoteMetaMaskProvider.js @@ -1,3 +1,5 @@ +const fromExponential = require('./FromExponential'); + class RemoteMetaMaskProvider { constructor(connector) { this._connector = connector; @@ -74,6 +76,13 @@ class RemoteMetaMaskProvider { // Format for "eth_filter" if (result && result.logIndex) return [result]; + // If result is in scientific notation, + // then convert it into number form so that it can be used by ethers' bignumber type + // e.g. from 9.99862115952e+21 to 9998621159520000000000 + if (result && !isNaN(result) && (typeof result === 'string') && (!result.startsWith('0x'))) { + return fromExponential(result); + } + return result; }