Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions FromExponential.js
Original file line number Diff line number Diff line change
@@ -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;
9 changes: 9 additions & 0 deletions RemoteMetaMaskProvider.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const fromExponential = require('./FromExponential');

class RemoteMetaMaskProvider {
constructor(connector) {
this._connector = connector;
Expand Down Expand Up @@ -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;
}

Expand Down