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

Merge branch 'AddTokenList' of github.com:MetaMask/metamask-plugin into AddTokenList

This commit is contained in:
Dan Finlay 2017-06-19 15:24:52 -07:00
commit 3ccc2b3d2a
7 changed files with 93 additions and 47 deletions

View File

@ -4,6 +4,7 @@
- Add list of popular tokens held to the account detail view. - Add list of popular tokens held to the account detail view.
- Add a warning to JSON file import. - Add a warning to JSON file import.
- Fix bug where slowly mined txs would sometimes be incorrectly marked as failed.
## 3.7.8 2017-6-12 ## 3.7.8 2017-6-12

15
ISSUE_TEMPLATE Normal file
View File

@ -0,0 +1,15 @@
<!--
FAQ:
BEFORE SUBMITTING, please make sure your question hasn't been answered in our FAQ: https://github.com/MetaMask/faq
Common questions such as "Where is my ether?" or "Where did my tokens go?" are answered in the FAQ.
Bug Reports:
Briefly describe the issue you've encountered
* Expected Behavior
* Actual Behavior
* Browser Used
* Operating System Used
Screenshots are very helpful and will expedite your issue being resolved!
-->

View File

@ -24,11 +24,12 @@ module.exports = class TransactionController extends EventEmitter {
this.blockTracker = opts.blockTracker this.blockTracker = opts.blockTracker
this.query = opts.ethQuery this.query = opts.ethQuery
this.txProviderUtils = new TxProviderUtil(this.query) this.txProviderUtils = new TxProviderUtil(this.query)
this.blockTracker.on('block', this.checkForTxInBlock.bind(this)) this.blockTracker.on('rawBlock', this.checkForTxInBlock.bind(this))
this.blockTracker.on('block', this.resubmitPendingTxs.bind(this)) this.blockTracker.on('latest', this.resubmitPendingTxs.bind(this))
this.blockTracker.on('sync', this.queryPendingTxs.bind(this))
this.signEthTx = opts.signTransaction this.signEthTx = opts.signTransaction
this.nonceLock = Semaphore(1) this.nonceLock = Semaphore(1)
this.ethStore = opts.ethStore
// memstore is computed from a few different stores // memstore is computed from a few different stores
this._updateMemstore() this._updateMemstore()
this.store.subscribe(() => this._updateMemstore()) this.store.subscribe(() => this._updateMemstore())
@ -338,12 +339,13 @@ module.exports = class TransactionController extends EventEmitter {
// checks if a signed tx is in a block and // checks if a signed tx is in a block and
// if included sets the tx status as 'confirmed' // if included sets the tx status as 'confirmed'
checkForTxInBlock () { checkForTxInBlock (block) {
var signedTxList = this.getFilteredTxList({status: 'submitted'}) var signedTxList = this.getFilteredTxList({status: 'submitted'})
if (!signedTxList.length) return if (!signedTxList.length) return
signedTxList.forEach((txMeta) => { signedTxList.forEach((txMeta) => {
var txHash = txMeta.hash var txHash = txMeta.hash
var txId = txMeta.id var txId = txMeta.id
if (!txHash) { if (!txHash) {
const errReason = { const errReason = {
errCode: 'No hash was provided', errCode: 'No hash was provided',
@ -351,24 +353,24 @@ module.exports = class TransactionController extends EventEmitter {
} }
return this.setTxStatusFailed(txId, errReason) return this.setTxStatusFailed(txId, errReason)
} }
this.query.getTransactionByHash(txHash, (err, txParams) => {
if (err || !txParams) { block.transactions.forEach((tx) => {
if (!txParams) return if (tx.hash === txHash) this.setTxStatusConfirmed(txId)
txMeta.err = {
isWarning: true,
errorCode: err,
message: 'There was a problem loading this transaction.',
}
this.updateTx(txMeta)
return log.error(err)
}
if (txParams.blockNumber) {
this.setTxStatusConfirmed(txId)
}
}) })
}) })
} }
queryPendingTxs ({oldBlock, newBlock}) {
// check pending transactions on start
if (!oldBlock) {
this._checkPendingTxs()
return
}
// if we synced by more than one block, check for missed pending transactions
const diff = Number.parseInt(newBlock.number) - Number.parseInt(oldBlock.number)
if (diff > 1) this._checkPendingTxs()
}
// PRIVATE METHODS // PRIVATE METHODS
// Should find the tx in the tx list and // Should find the tx in the tx list and
@ -411,38 +413,69 @@ module.exports = class TransactionController extends EventEmitter {
const pending = this.getTxsByMetaData('status', 'submitted') const pending = this.getTxsByMetaData('status', 'submitted')
// only try resubmitting if their are transactions to resubmit // only try resubmitting if their are transactions to resubmit
if (!pending.length) return if (!pending.length) return
const resubmit = denodeify(this.resubmitTx.bind(this)) const resubmit = denodeify(this._resubmitTx.bind(this))
Promise.all(pending.map(txMeta => resubmit(txMeta))) Promise.all(pending.map(txMeta => resubmit(txMeta)))
.catch((reason) => { .catch((reason) => {
log.info('Problem resubmitting tx', reason) log.info('Problem resubmitting tx', reason)
}) })
} }
resubmitTx (txMeta, cb) { _resubmitTx (txMeta, cb) {
// Increment a try counter. const address = txMeta.txParams.from
if (!('retryCount' in txMeta)) { const balance = this.ethStore.getState().accounts[address].balance
txMeta.retryCount = 0 const nonce = Number.parseInt(this.ethStore.getState().accounts[address].nonce)
} const txNonce = Number.parseInt(txMeta.txParams.nonce)
const gtBalance = Number.parseInt(txMeta.txParams.value) > Number.parseInt(balance)
if (!('retryCount' in txMeta)) txMeta.retryCount = 0
// if the value of the transaction is greater then the balance
// or the nonce of the transaction is lower then the accounts nonce
// dont resubmit the tx
if (gtBalance || txNonce < nonce) return cb()
// Only auto-submit already-signed txs: // Only auto-submit already-signed txs:
if (!('rawTx' in txMeta)) { if (!('rawTx' in txMeta)) return cb()
return cb()
}
if (txMeta.retryCount > RETRY_LIMIT) { if (txMeta.retryCount > RETRY_LIMIT) return
txMeta.err = {
isWarning: true,
message: 'Gave up submitting tx.',
}
this.updateTx(txMeta)
return log.error(txMeta.err.message)
}
// Increment a try counter.
txMeta.retryCount++ txMeta.retryCount++
const rawTx = txMeta.rawTx const rawTx = txMeta.rawTx
this.txProviderUtils.publishTransaction(rawTx, cb) this.txProviderUtils.publishTransaction(rawTx, cb)
} }
// checks the network for signed txs and
// if confirmed sets the tx status as 'confirmed'
_checkPendingTxs () {
var signedTxList = this.getFilteredTxList({status: 'submitted'})
if (!signedTxList.length) return
signedTxList.forEach((txMeta) => {
var txHash = txMeta.hash
var txId = txMeta.id
if (!txHash) {
const errReason = {
errCode: 'No hash was provided',
message: 'We had an error while submitting this transaction, please try again.',
}
return this.setTxStatusFailed(txId, errReason)
}
this.query.getTransactionByHash(txHash, (err, txParams) => {
if (err || !txParams) {
if (!txParams) return
txMeta.err = {
isWarning: true,
errorCode: err,
message: 'There was a problem loading this transaction.',
}
this.updateTx(txMeta)
return log.error(err)
}
if (txParams.blockNumber) {
this.setTxStatusConfirmed(txId)
}
})
})
}
} }

View File

@ -23,6 +23,7 @@ const autoFaucet = require('./lib/auto-faucet')
const nodeify = require('./lib/nodeify') const nodeify = require('./lib/nodeify')
const accountImporter = require('./account-import-strategies') const accountImporter = require('./account-import-strategies')
const getBuyEthUrl = require('./lib/buy-eth-url') const getBuyEthUrl = require('./lib/buy-eth-url')
const debounce = require('debounce')
const version = require('../manifest.json').version const version = require('../manifest.json').version
@ -30,6 +31,9 @@ module.exports = class MetamaskController extends EventEmitter {
constructor (opts) { constructor (opts) {
super() super()
this.sendUpdate = debounce(this.privateSendUpdate.bind(this), 200)
this.opts = opts this.opts = opts
const initState = opts.initState || {} const initState = opts.initState || {}
@ -98,6 +102,7 @@ module.exports = class MetamaskController extends EventEmitter {
provider: this.provider, provider: this.provider,
blockTracker: this.provider, blockTracker: this.provider,
ethQuery: this.ethQuery, ethQuery: this.ethQuery,
ethStore: this.ethStore,
}) })
// notices // notices
@ -355,7 +360,7 @@ module.exports = class MetamaskController extends EventEmitter {
) )
} }
sendUpdate () { privateSendUpdate () {
this.emit('update', this.getState()) this.emit('update', this.getState())
} }

View File

@ -64,7 +64,7 @@
"eth-bin-to-ops": "^1.0.1", "eth-bin-to-ops": "^1.0.1",
"eth-contract-metadata": "^1.1.3", "eth-contract-metadata": "^1.1.3",
"eth-hd-keyring": "^1.1.1", "eth-hd-keyring": "^1.1.1",
"eth-query": "^2.1.1", "eth-query": "^2.1.2",
"eth-sig-util": "^1.1.1", "eth-sig-util": "^1.1.1",
"eth-simple-keyring": "^1.1.1", "eth-simple-keyring": "^1.1.1",
"eth-token-tracker": "^1.0.8", "eth-token-tracker": "^1.0.8",
@ -124,7 +124,7 @@
"valid-url": "^1.0.9", "valid-url": "^1.0.9",
"vreme": "^3.0.2", "vreme": "^3.0.2",
"web3": "0.18.2", "web3": "0.18.2",
"web3-provider-engine": "^12.2.4", "web3-provider-engine": "^13.0.3",
"web3-stream-provider": "^2.0.6", "web3-stream-provider": "^2.0.6",
"xtend": "^4.0.1" "xtend": "^4.0.1"
}, },

View File

@ -1,9 +0,0 @@
// LINTING:
const lint = require('mocha-eslint')
const lintPaths = ['app/**/*.js', 'ui/**/*.js', 'test/**/*.js', '!node_modules/**', '!dist/**', '!docs/**', '!app/scripts/chromereload.js']
const lintOptions = {
strict: false,
}
lint(lintPaths, lintOptions)

View File

@ -19,6 +19,7 @@ describe('Transaction Controller', function () {
txController = new TransactionController({ txController = new TransactionController({
networkStore: new ObservableStore(currentNetworkId), networkStore: new ObservableStore(currentNetworkId),
txHistoryLimit: 10, txHistoryLimit: 10,
provider: { _blockTracker: new EventEmitter()},
blockTracker: new EventEmitter(), blockTracker: new EventEmitter(),
ethQuery: new EthQuery(new EventEmitter()), ethQuery: new EthQuery(new EventEmitter()),
signTransaction: (ethTx) => new Promise((resolve) => { signTransaction: (ethTx) => new Promise((resolve) => {