From 10c45dd4c8c77ca9bd2610fb66f6be7f430784d6 Mon Sep 17 00:00:00 2001 From: Nick Pai Date: Thu, 20 Feb 2020 16:45:15 -0500 Subject: [PATCH 1/6] add ability to convert from scientific notation to number Signed-off-by: Nick Pai --- FromExponential.js | 33 +++++++++++++++++++++++++++++++++ RemoteMetaMaskProvider.js | 9 +++++++++ 2 files changed, 42 insertions(+) create mode 100644 FromExponential.js 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..5636534 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 a number in scientific notation, which nodeJS might automatically convert it into if it is >= 1e21, + // then it back into a number form so that it can be used by ethers' bignumber type + // e.g. from 9.99862115952e+21 to 9998621159520000000000 + if (!isNaN(result) && (typeof result === 'string') && (!result.startsWith('0x')) && (Number(result) >= 1e21)) { + return fromExponential(result) + } + return result; } From cb0397a2f85e565ee3ff8b529efaa33d5dfb6cfb Mon Sep 17 00:00:00 2001 From: Nick Pai Date: Thu, 20 Feb 2020 17:14:51 -0500 Subject: [PATCH 2/6] add check if result exists Signed-off-by: Nick Pai --- RemoteMetaMaskProvider.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RemoteMetaMaskProvider.js b/RemoteMetaMaskProvider.js index 5636534..71bcc9d 100644 --- a/RemoteMetaMaskProvider.js +++ b/RemoteMetaMaskProvider.js @@ -79,8 +79,8 @@ class RemoteMetaMaskProvider { // If result is a number in scientific notation, which nodeJS might automatically convert it into if it is >= 1e21, // then it back into a number form so that it can be used by ethers' bignumber type // e.g. from 9.99862115952e+21 to 9998621159520000000000 - if (!isNaN(result) && (typeof result === 'string') && (!result.startsWith('0x')) && (Number(result) >= 1e21)) { - return fromExponential(result) + if (result && !isNaN(result) && (typeof result === 'string') && (!result.startsWith('0x')) && (Number(result) >= 1e21)) { + return fromExponential(result); } return result; From 0cd00b82c7aa422f9f49dc1e814820b9a356b477 Mon Sep 17 00:00:00 2001 From: Nick Pai Date: Thu, 20 Feb 2020 18:20:59 -0500 Subject: [PATCH 3/6] remove check for result>=1e21 Signed-off-by: Nick Pai --- RemoteMetaMaskProvider.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/RemoteMetaMaskProvider.js b/RemoteMetaMaskProvider.js index 71bcc9d..ffbb5db 100644 --- a/RemoteMetaMaskProvider.js +++ b/RemoteMetaMaskProvider.js @@ -1,4 +1,4 @@ -const fromExponential = require('./FromExponential'); +// const fromExponential = require('./FromExponential'); class RemoteMetaMaskProvider { constructor(connector) { @@ -76,12 +76,12 @@ class RemoteMetaMaskProvider { // Format for "eth_filter" if (result && result.logIndex) return [result]; - // If result is a number in scientific notation, which nodeJS might automatically convert it into if it is >= 1e21, - // then it back into a 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')) && (Number(result) >= 1e21)) { - return fromExponential(result); - } + // // If result is a number in scientific notation, which nodeJS might automatically convert it into if it is >= 1e21, + // // then it back into a 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')) && (Number(result) >= 1e21)) { + // return fromExponential(result); + // } return result; } From 09bd4fc50725f534a9a7029aa3ddc5fc6137539f Mon Sep 17 00:00:00 2001 From: Nick Pai Date: Thu, 20 Feb 2020 18:22:56 -0500 Subject: [PATCH 4/6] condense check Signed-off-by: Nick Pai --- RemoteMetaMaskProvider.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/RemoteMetaMaskProvider.js b/RemoteMetaMaskProvider.js index ffbb5db..b735283 100644 --- a/RemoteMetaMaskProvider.js +++ b/RemoteMetaMaskProvider.js @@ -76,12 +76,12 @@ class RemoteMetaMaskProvider { // Format for "eth_filter" if (result && result.logIndex) return [result]; - // // If result is a number in scientific notation, which nodeJS might automatically convert it into if it is >= 1e21, - // // then it back into a 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')) && (Number(result) >= 1e21)) { - // return fromExponential(result); - // } + // If result is a number in scientific notation, which nodeJS might automatically convert it into if it is >= 1e21, + // then it back into a number form so that it can be used by ethers' bignumber type + // e.g. from 9.99862115952e+21 to 9998621159520000000000 + if (result && !isNaN(result)) { + return fromExponential(result); + } return result; } From 59874c2d69cc80c1d5c2ab0a95eb90c2bdf41421 Mon Sep 17 00:00:00 2001 From: Nick Pai Date: Thu, 20 Feb 2020 18:25:59 -0500 Subject: [PATCH 5/6] uncomment Signed-off-by: Nick Pai --- RemoteMetaMaskProvider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RemoteMetaMaskProvider.js b/RemoteMetaMaskProvider.js index b735283..2afbcd5 100644 --- a/RemoteMetaMaskProvider.js +++ b/RemoteMetaMaskProvider.js @@ -1,4 +1,4 @@ -// const fromExponential = require('./FromExponential'); +const fromExponential = require('./FromExponential'); class RemoteMetaMaskProvider { constructor(connector) { From 36b33cb82558bafcd3ab0dcfbd35b26c2c0a2584 Mon Sep 17 00:00:00 2001 From: Nick Pai Date: Thu, 20 Feb 2020 18:40:25 -0500 Subject: [PATCH 6/6] check if result is a number, is a string, and is not a hex string Signed-off-by: Nick Pai --- RemoteMetaMaskProvider.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/RemoteMetaMaskProvider.js b/RemoteMetaMaskProvider.js index 2afbcd5..3916e8f 100644 --- a/RemoteMetaMaskProvider.js +++ b/RemoteMetaMaskProvider.js @@ -76,12 +76,12 @@ class RemoteMetaMaskProvider { // Format for "eth_filter" if (result && result.logIndex) return [result]; - // If result is a number in scientific notation, which nodeJS might automatically convert it into if it is >= 1e21, - // then it back into a number form so that it can be used by ethers' bignumber type + // 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)) { - return fromExponential(result); - } + if (result && !isNaN(result) && (typeof result === 'string') && (!result.startsWith('0x'))) { + return fromExponential(result); + } return result; }