diff options
author | Dan Finlay <542863+danfinlay@users.noreply.github.com> | 2017-10-10 05:15:09 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-10 05:15:09 +0800 |
commit | f18615a82abafee1a648e8de6f60ecc54e1aabb4 (patch) | |
tree | 053914da168a427f0c644f81fa02119aca9ce5b5 | |
parent | 7f70c866c3a74fadbc34f9b979902b89bba666f5 (diff) | |
parent | d82d9215fbe593293a6badc523218878cfb13dd2 (diff) | |
download | tangerine-wallet-browser-f18615a82abafee1a648e8de6f60ecc54e1aabb4.tar tangerine-wallet-browser-f18615a82abafee1a648e8de6f60ecc54e1aabb4.tar.gz tangerine-wallet-browser-f18615a82abafee1a648e8de6f60ecc54e1aabb4.tar.bz2 tangerine-wallet-browser-f18615a82abafee1a648e8de6f60ecc54e1aabb4.tar.lz tangerine-wallet-browser-f18615a82abafee1a648e8de6f60ecc54e1aabb4.tar.xz tangerine-wallet-browser-f18615a82abafee1a648e8de6f60ecc54e1aabb4.tar.zst tangerine-wallet-browser-f18615a82abafee1a648e8de6f60ecc54e1aabb4.zip |
Merge pull request #2296 from MetaMask/precision-fix
Fix precision to account for small wei increase.
-rw-r--r-- | test/unit/components/bn-as-decimal-input-test.js | 38 | ||||
-rw-r--r-- | ui/app/components/bn-as-decimal-input.js | 11 |
2 files changed, 45 insertions, 4 deletions
diff --git a/test/unit/components/bn-as-decimal-input-test.js b/test/unit/components/bn-as-decimal-input-test.js index 106b3a871..58ecc9c89 100644 --- a/test/unit/components/bn-as-decimal-input-test.js +++ b/test/unit/components/bn-as-decimal-input-test.js @@ -48,4 +48,42 @@ describe('BnInput', function () { checkValidity () { return true } }, }) }) + + it('can tolerate wei precision', function (done) { + const renderer = ReactTestUtils.createRenderer() + + let valueStr = '1000000000' + + const value = new BN(valueStr, 10) + const inputStr = '1.000000001' + + + let targetStr = '1000000001' + + const target = new BN(targetStr, 10) + + const precision = 9 // gwei precision + const scale = 9 + + const props = { + value, + scale, + precision, + onChange: (newBn) => { + assert.equal(newBn.toString(), target.toString(), 'should tolerate increase') + const reInput = BnInput.prototype.downsize(newBn.toString(), 9, 9) + assert.equal(reInput.toString(), inputStr, 'should tolerate increase') + done() + }, + } + + const inputComponent = h(BnInput, props) + const component = additions.renderIntoDocument(inputComponent) + renderer.render(inputComponent) + const input = additions.find(component, 'input.hex-input')[0] + ReactTestUtils.Simulate.change(input, { preventDefault () {}, target: { + value: inputStr, + checkValidity () { return true } }, + }) + }) }) diff --git a/ui/app/components/bn-as-decimal-input.js b/ui/app/components/bn-as-decimal-input.js index f3ace4720..d84834d06 100644 --- a/ui/app/components/bn-as-decimal-input.js +++ b/ui/app/components/bn-as-decimal-input.js @@ -31,7 +31,7 @@ BnAsDecimalInput.prototype.render = function () { const suffix = props.suffix const style = props.style const valueString = value.toString(10) - const newValue = this.downsize(valueString, scale, precision) + const newValue = this.downsize(valueString, scale) return ( h('.flex-column', [ @@ -145,14 +145,17 @@ BnAsDecimalInput.prototype.constructWarning = function () { } -BnAsDecimalInput.prototype.downsize = function (number, scale, precision) { +BnAsDecimalInput.prototype.downsize = function (number, scale) { // if there is no scaling, simply return the number if (scale === 0) { return Number(number) } else { // if the scale is the same as the precision, account for this edge case. - var decimals = (scale === precision) ? -1 : scale - precision - return Number(number.slice(0, -scale) + '.' + number.slice(-scale, decimals)) + var adjustedNumber = number + while (adjustedNumber.length < scale) { + adjustedNumber = '0' + adjustedNumber + } + return Number(adjustedNumber.slice(0, -scale) + '.' + adjustedNumber.slice(-scale)) } } |