mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
parent
db4569e920
commit
222e62d7f1
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
- Update transaction statuses when switching networks.
|
- Update transaction statuses when switching networks.
|
||||||
- [#5470](https://github.com/MetaMask/metamask-extension/pull/5470) 100% coverage in French locale, fixed the procedure to verify proposed locale.
|
- [#5470](https://github.com/MetaMask/metamask-extension/pull/5470) 100% coverage in French locale, fixed the procedure to verify proposed locale.
|
||||||
|
- [#5283](https://github.com/MetaMask/metamask-extension/pull/5283): Fix bug when eth.getCode() called with no contract
|
||||||
|
|
||||||
## 4.12.0 Thursday September 27 2018
|
## 4.12.0 Thursday September 27 2018
|
||||||
|
|
||||||
|
@ -1154,6 +1154,9 @@
|
|||||||
"transactionError": {
|
"transactionError": {
|
||||||
"message": "Transaction Error. Exception thrown in contract code."
|
"message": "Transaction Error. Exception thrown in contract code."
|
||||||
},
|
},
|
||||||
|
"transactionErrorNoContract": {
|
||||||
|
"message": "Trying to call a contract function at an address that is not a contract address."
|
||||||
|
},
|
||||||
"transactionMemo": {
|
"transactionMemo": {
|
||||||
"message": "Transaction memo (optional)"
|
"message": "Transaction memo (optional)"
|
||||||
},
|
},
|
||||||
|
@ -7,6 +7,8 @@ const {
|
|||||||
const { addHexPrefix } = require('ethereumjs-util')
|
const { addHexPrefix } = require('ethereumjs-util')
|
||||||
const SIMPLE_GAS_COST = '0x5208' // Hex for 21000, cost of a simple send.
|
const SIMPLE_GAS_COST = '0x5208' // Hex for 21000, cost of a simple send.
|
||||||
|
|
||||||
|
import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/app/constants/error-keys'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
tx-gas-utils are gas utility methods for Transaction manager
|
tx-gas-utils are gas utility methods for Transaction manager
|
||||||
its passed ethquery
|
its passed ethquery
|
||||||
@ -32,6 +34,7 @@ class TxGasUtil {
|
|||||||
} catch (err) {
|
} catch (err) {
|
||||||
txMeta.simulationFails = {
|
txMeta.simulationFails = {
|
||||||
reason: err.message,
|
reason: err.message,
|
||||||
|
errorKey: err.errorKey,
|
||||||
}
|
}
|
||||||
return txMeta
|
return txMeta
|
||||||
}
|
}
|
||||||
@ -56,17 +59,23 @@ class TxGasUtil {
|
|||||||
return txParams.gas
|
return txParams.gas
|
||||||
}
|
}
|
||||||
|
|
||||||
// if recipient has no code, gas is 21k max:
|
|
||||||
const recipient = txParams.to
|
const recipient = txParams.to
|
||||||
const hasRecipient = Boolean(recipient)
|
const hasRecipient = Boolean(recipient)
|
||||||
let code
|
|
||||||
if (recipient) code = await this.query.getCode(recipient)
|
|
||||||
|
|
||||||
if (hasRecipient && (!code || code === '0x')) {
|
if (hasRecipient) {
|
||||||
txParams.gas = SIMPLE_GAS_COST
|
let code = await this.query.getCode(recipient)
|
||||||
|
|
||||||
|
// If there's data in the params, but there's no code, it's not a valid contract
|
||||||
|
// For no code, Infura will return '0x', and Ganache will return '0x0'
|
||||||
|
if (txParams.data && (!code || code === '0x' || code === '0x0')) {
|
||||||
|
throw {errorKey: TRANSACTION_NO_CONTRACT_ERROR_KEY}
|
||||||
|
}
|
||||||
|
else if (!code) {
|
||||||
|
txParams.gas = SIMPLE_GAS_COST // For a standard ETH send, gas is 21k max
|
||||||
txMeta.simpleSend = true // Prevents buffer addition
|
txMeta.simpleSend = true // Prevents buffer addition
|
||||||
return SIMPLE_GAS_COST
|
return SIMPLE_GAS_COST
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// if not, fall back to block gasLimit
|
// if not, fall back to block gasLimit
|
||||||
const blockGasLimitBN = hexToBn(blockGasLimitHex)
|
const blockGasLimitBN = hexToBn(blockGasLimitHex)
|
||||||
|
@ -489,7 +489,7 @@ PendingTx.prototype.verifyGasParams = function () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PendingTx.prototype._notZeroOrEmptyString = function (obj) {
|
PendingTx.prototype._notZeroOrEmptyString = function (obj) {
|
||||||
return obj !== '' && obj !== '0x0'
|
return obj !== '' && obj !== '0x0' && obj !== '0x' // The '0x' case might not ever happen, but it seems safest to protect against it
|
||||||
}
|
}
|
||||||
|
|
||||||
PendingTx.prototype.bnMultiplyByFraction = function (targetBN, numerator, denominator) {
|
PendingTx.prototype.bnMultiplyByFraction = function (targetBN, numerator, denominator) {
|
||||||
|
@ -131,7 +131,7 @@ export default class ConfirmTransactionBase extends Component {
|
|||||||
if (simulationFails) {
|
if (simulationFails) {
|
||||||
return {
|
return {
|
||||||
valid: true,
|
valid: true,
|
||||||
errorKey: TRANSACTION_ERROR_KEY,
|
errorKey: simulationFails.errorKey ? simulationFails.errorKey : TRANSACTION_ERROR_KEY,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@ async function estimateGas ({
|
|||||||
// if recipient has no code, gas is 21k max:
|
// if recipient has no code, gas is 21k max:
|
||||||
if (!selectedToken && !data) {
|
if (!selectedToken && !data) {
|
||||||
const code = Boolean(to) && await global.eth.getCode(to)
|
const code = Boolean(to) && await global.eth.getCode(to)
|
||||||
if (!code || code === '0x') {
|
if (!code || code === '0x' || code === '0x0') { // Infura will return '0x', and Ganache will return '0x0'
|
||||||
return SIMPLE_GAS_COST
|
return SIMPLE_GAS_COST
|
||||||
}
|
}
|
||||||
} else if (selectedToken && !to) {
|
} else if (selectedToken && !to) {
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
export const INSUFFICIENT_FUNDS_ERROR_KEY = 'insufficientFunds'
|
export const INSUFFICIENT_FUNDS_ERROR_KEY = 'insufficientFunds'
|
||||||
export const GAS_LIMIT_TOO_LOW_ERROR_KEY = 'gasLimitTooLow'
|
export const GAS_LIMIT_TOO_LOW_ERROR_KEY = 'gasLimitTooLow'
|
||||||
export const TRANSACTION_ERROR_KEY = 'transactionError'
|
export const TRANSACTION_ERROR_KEY = 'transactionError'
|
||||||
|
export const TRANSACTION_NO_CONTRACT_ERROR_KEY = 'transactionErrorNoContract'
|
||||||
|
@ -114,7 +114,7 @@ export function getLatestSubmittedTxWithNonce (transactions = [], nonce = '0x0')
|
|||||||
|
|
||||||
export async function isSmartContractAddress (address) {
|
export async function isSmartContractAddress (address) {
|
||||||
const code = await global.eth.getCode(address)
|
const code = await global.eth.getCode(address)
|
||||||
return code && code !== '0x'
|
return code && code !== '0x' && code !== '0x0'; // Infura will return '0x', and Ganache will return '0x0'
|
||||||
}
|
}
|
||||||
|
|
||||||
export function sumHexes (...args) {
|
export function sumHexes (...args) {
|
||||||
|
Loading…
Reference in New Issue
Block a user