mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Merge branch 'master' into i2621-0xRecipientAddress
This commit is contained in:
commit
d11ec81f49
@ -3,6 +3,7 @@
|
|||||||
## Current Master
|
## Current Master
|
||||||
|
|
||||||
- Remove recipient field if application initializes a tx with an empty string, or 0x, and tx data. Throw an error with the same condition, but without tx data.
|
- Remove recipient field if application initializes a tx with an empty string, or 0x, and tx data. Throw an error with the same condition, but without tx data.
|
||||||
|
- Improve gas price suggestion to be closer to the lowest that will be accepted.
|
||||||
- Throw an error if a application tries to submit a tx whose value is a decimal, and inform that it should be in wei.
|
- Throw an error if a application tries to submit a tx whose value is a decimal, and inform that it should be in wei.
|
||||||
- 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.
|
||||||
|
@ -57,3 +57,4 @@ class BlacklistController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
module.exports = BlacklistController
|
module.exports = BlacklistController
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ module.exports = class TransactionController extends EventEmitter {
|
|||||||
this.provider = opts.provider
|
this.provider = opts.provider
|
||||||
this.blockTracker = opts.blockTracker
|
this.blockTracker = opts.blockTracker
|
||||||
this.signEthTx = opts.signTransaction
|
this.signEthTx = opts.signTransaction
|
||||||
|
this.getGasPrice = opts.getGasPrice
|
||||||
|
|
||||||
this.memStore = new ObservableStore({})
|
this.memStore = new ObservableStore({})
|
||||||
this.query = new EthQuery(this.provider)
|
this.query = new EthQuery(this.provider)
|
||||||
@ -179,7 +180,8 @@ module.exports = class TransactionController extends EventEmitter {
|
|||||||
// ensure value
|
// ensure value
|
||||||
txMeta.gasPriceSpecified = Boolean(txParams.gasPrice)
|
txMeta.gasPriceSpecified = Boolean(txParams.gasPrice)
|
||||||
txMeta.nonceSpecified = Boolean(txParams.nonce)
|
txMeta.nonceSpecified = Boolean(txParams.nonce)
|
||||||
const gasPrice = txParams.gasPrice || await this.query.gasPrice()
|
const gasPrice = txParams.gasPrice || this.getGasPrice ? this.getGasPrice()
|
||||||
|
: await this.query.gasPrice()
|
||||||
txParams.gasPrice = ethUtil.addHexPrefix(gasPrice.toString(16))
|
txParams.gasPrice = ethUtil.addHexPrefix(gasPrice.toString(16))
|
||||||
txParams.value = txParams.value || '0x0'
|
txParams.value = txParams.value || '0x0'
|
||||||
// set gasLimit
|
// set gasLimit
|
||||||
|
@ -35,13 +35,15 @@ const accountImporter = require('./account-import-strategies')
|
|||||||
const getBuyEthUrl = require('./lib/buy-eth-url')
|
const getBuyEthUrl = require('./lib/buy-eth-url')
|
||||||
const Mutex = require('await-semaphore').Mutex
|
const Mutex = require('await-semaphore').Mutex
|
||||||
const version = require('../manifest.json').version
|
const version = require('../manifest.json').version
|
||||||
|
const BN = require('ethereumjs-util').BN
|
||||||
|
const GWEI_BN = new BN('1000000000')
|
||||||
|
const percentile = require('percentile')
|
||||||
|
|
||||||
module.exports = class MetamaskController extends EventEmitter {
|
module.exports = class MetamaskController extends EventEmitter {
|
||||||
|
|
||||||
constructor (opts) {
|
constructor (opts) {
|
||||||
super()
|
super()
|
||||||
|
|
||||||
|
|
||||||
this.sendUpdate = debounce(this.privateSendUpdate.bind(this), 200)
|
this.sendUpdate = debounce(this.privateSendUpdate.bind(this), 200)
|
||||||
|
|
||||||
this.opts = opts
|
this.opts = opts
|
||||||
@ -139,6 +141,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
provider: this.provider,
|
provider: this.provider,
|
||||||
blockTracker: this.blockTracker,
|
blockTracker: this.blockTracker,
|
||||||
ethQuery: this.ethQuery,
|
ethQuery: this.ethQuery,
|
||||||
|
getGasPrice: this.getGasPrice.bind(this),
|
||||||
})
|
})
|
||||||
this.txController.on('newUnapprovedTx', opts.showUnapprovedTx.bind(opts))
|
this.txController.on('newUnapprovedTx', opts.showUnapprovedTx.bind(opts))
|
||||||
|
|
||||||
@ -484,6 +487,26 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
this.emit('update', this.getState())
|
this.emit('update', this.getState())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getGasPrice () {
|
||||||
|
const { recentBlocksController } = this
|
||||||
|
const { recentBlocks } = recentBlocksController.store.getState()
|
||||||
|
const lowestPrices = recentBlocks.map((block) => {
|
||||||
|
if (!block.gasPrices) {
|
||||||
|
return new BN(0)
|
||||||
|
}
|
||||||
|
return block.gasPrices
|
||||||
|
.map(hexPrefix => hexPrefix.substr(2))
|
||||||
|
.map(hex => new BN(hex, 16))
|
||||||
|
.sort((a, b) => {
|
||||||
|
return a.gt(b) ? 1 : -1
|
||||||
|
})[0]
|
||||||
|
})
|
||||||
|
.map(number => number.div(GWEI_BN).toNumber())
|
||||||
|
const percentileNum = percentile(50, lowestPrices)
|
||||||
|
const percentileNumBn = new BN(percentileNum)
|
||||||
|
return '0x' + percentileNumBn.mul(GWEI_BN).toString(16)
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Vault Management
|
// Vault Management
|
||||||
//
|
//
|
||||||
|
@ -119,6 +119,7 @@
|
|||||||
"obj-multiplex": "^1.0.0",
|
"obj-multiplex": "^1.0.0",
|
||||||
"obs-store": "^3.0.0",
|
"obs-store": "^3.0.0",
|
||||||
"once": "^1.3.3",
|
"once": "^1.3.3",
|
||||||
|
"percentile": "^1.2.0",
|
||||||
"ping-pong-stream": "^1.0.0",
|
"ping-pong-stream": "^1.0.0",
|
||||||
"pojo-migrator": "^2.1.0",
|
"pojo-migrator": "^2.1.0",
|
||||||
"polyfill-crypto.getrandomvalues": "^1.0.0",
|
"polyfill-crypto.getrandomvalues": "^1.0.0",
|
||||||
|
@ -3,6 +3,8 @@ const sinon = require('sinon')
|
|||||||
const clone = require('clone')
|
const clone = require('clone')
|
||||||
const MetaMaskController = require('../../app/scripts/metamask-controller')
|
const MetaMaskController = require('../../app/scripts/metamask-controller')
|
||||||
const firstTimeState = require('../../app/scripts/first-time-state')
|
const firstTimeState = require('../../app/scripts/first-time-state')
|
||||||
|
const BN = require('ethereumjs-util').BN
|
||||||
|
const GWEI_BN = new BN('1000000000')
|
||||||
|
|
||||||
describe('MetaMaskController', function () {
|
describe('MetaMaskController', function () {
|
||||||
const noop = () => {}
|
const noop = () => {}
|
||||||
@ -45,6 +47,31 @@ describe('MetaMaskController', function () {
|
|||||||
metamaskController.keyringController.createNewVaultAndKeychain.restore()
|
metamaskController.keyringController.createNewVaultAndKeychain.restore()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('#getGasPrice', function () {
|
||||||
|
it('gives the 50th percentile lowest accepted gas price from recentBlocksController', async function () {
|
||||||
|
const realRecentBlocksController = metamaskController.recentBlocksController
|
||||||
|
metamaskController.recentBlocksController = {
|
||||||
|
store: {
|
||||||
|
getState: () => {
|
||||||
|
return {
|
||||||
|
recentBlocks: [
|
||||||
|
{ gasPrices: [ '0x3b9aca00', '0x174876e800'] },
|
||||||
|
{ gasPrices: [ '0x3b9aca00', '0x174876e800'] },
|
||||||
|
{ gasPrices: [ '0x174876e800', '0x174876e800' ]},
|
||||||
|
{ gasPrices: [ '0x174876e800', '0x174876e800' ]},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const gasPrice = metamaskController.getGasPrice()
|
||||||
|
assert.equal(gasPrice, '0x3b9aca00', 'accurately estimates 50th percentile accepted gas price')
|
||||||
|
|
||||||
|
metamaskController.recentBlocksController = realRecentBlocksController
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('#createNewVaultAndKeychain', function () {
|
describe('#createNewVaultAndKeychain', function () {
|
||||||
it('can only create new vault on keyringController once', async function () {
|
it('can only create new vault on keyringController once', async function () {
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user