1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Merge pull request #2818 from MetaMask/i2782-ethroundingerror

Fix rounding error in ether input on send screen
This commit is contained in:
Dan Finlay 2017-12-28 14:55:42 -08:00 committed by GitHub
commit a22e98910d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 35 additions and 3 deletions

View File

@ -4,6 +4,7 @@
- Fix bug that prevented updating custom token details. - Fix bug that prevented updating custom token details.
- No longer mark long-pending transactions as failed, since we now have button to retry with higher gas. - No longer mark long-pending transactions as failed, since we now have button to retry with higher gas.
- Fix rounding error when specifying an ether amount that has too much precision.
## 3.13.3 2017-12-14 ## 3.13.3 2017-12-14

View File

@ -26,7 +26,7 @@ module.exports = class txProvideUtil {
err.message.includes('Transaction execution error.') || err.message.includes('Transaction execution error.') ||
err.message.includes('gas required exceeds allowance or always failing transaction') err.message.includes('gas required exceeds allowance or always failing transaction')
) )
if ( simulationFailed ) { if (simulationFailed) {
txMeta.simulationFails = true txMeta.simulationFails = true
return txMeta return txMeta
} }

View File

@ -77,7 +77,7 @@ module.exports = class NoticeController extends EventEmitter {
return uniqBy(oldNotices.concat(newNotices), 'id') return uniqBy(oldNotices.concat(newNotices), 'id')
} }
_filterNotices(notices) { _filterNotices (notices) {
return notices.filter((newNotice) => { return notices.filter((newNotice) => {
if ('version' in newNotice) { if ('version' in newNotice) {
const satisfied = semver.satisfies(this.version, newNotice.version) const satisfied = semver.satisfies(this.version, newNotice.version)

View File

@ -201,6 +201,18 @@ describe('util', function () {
var output = util.normalizeEthStringToWei(input) var output = util.normalizeEthStringToWei(input)
assert.equal(output.toString(10), ethInWei) assert.equal(output.toString(10), ethInWei)
}) })
it('should account for overflow numbers gracefully by dropping extra precision.', function () {
var input = '1.11111111111111111111'
var output = util.normalizeEthStringToWei(input)
assert.equal(output.toString(10), '1111111111111111111')
})
it('should not truncate very exact wei values that do not have extra precision.', function () {
var input = '1.100000000000000001'
var output = util.normalizeEthStringToWei(input)
assert.equal(output.toString(10), '1100000000000000001')
})
}) })
describe('#normalizeNumberToWei', function () { describe('#normalizeNumberToWei', function () {

View File

@ -247,10 +247,26 @@ SendTransactionScreen.prototype.onSubmit = function () {
const recipient = state.recipient || document.querySelector('input[name="address"]').value.replace(/^[.\s]+|[.\s]+$/g, '') const recipient = state.recipient || document.querySelector('input[name="address"]').value.replace(/^[.\s]+|[.\s]+$/g, '')
const nickname = state.nickname || ' ' const nickname = state.nickname || ' '
const input = document.querySelector('input[name="amount"]').value const input = document.querySelector('input[name="amount"]').value
const parts = input.split('')
let message
if (isNaN(input) || input === '') {
message = 'Invalid ether value.'
return this.props.dispatch(actions.displayWarning(message))
}
if (parts[1]) {
var decimal = parts[1]
if (decimal.length > 18) {
message = 'Ether amount is too precise.'
return this.props.dispatch(actions.displayWarning(message))
}
}
const value = util.normalizeEthStringToWei(input) const value = util.normalizeEthStringToWei(input)
const txData = document.querySelector('input[name="txData"]').value const txData = document.querySelector('input[name="txData"]').value
const balance = this.props.balance const balance = this.props.balance
let message
if (value.gt(balance)) { if (value.gt(balance)) {
message = 'Insufficient funds.' message = 'Insufficient funds.'

View File

@ -193,6 +193,9 @@ function normalizeEthStringToWei (str) {
while (decimal.length < 18) { while (decimal.length < 18) {
decimal += '0' decimal += '0'
} }
if (decimal.length > 18) {
decimal = decimal.slice(0, 18)
}
const decimalBN = new ethUtil.BN(decimal, 10) const decimalBN = new ethUtil.BN(decimal, 10)
eth = eth.add(decimalBN) eth = eth.add(decimalBN)
} }