mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-10-23 03:36:18 +02:00
Merge branch 'i1234-HardGasLimits-BrowserForm' of github.com:MetaMask/metamask-plugin into i1234-HardGasLimits-BrowserForm
This commit is contained in:
commit
6b100163e9
@ -7,10 +7,12 @@
|
|||||||
- Added an address book functionality that remembers the last 15 unique addresses sent to.
|
- Added an address book functionality that remembers the last 15 unique addresses sent to.
|
||||||
- Can now change network to custom RPC URL from lock screen.
|
- Can now change network to custom RPC URL from lock screen.
|
||||||
- Removed support for old, lightwallet based vault. Users who have not opened app in over a month will need to recover with their seed phrase. This will allow Firefox support sooner.
|
- Removed support for old, lightwallet based vault. Users who have not opened app in over a month will need to recover with their seed phrase. This will allow Firefox support sooner.
|
||||||
|
- Fixed bug where spinner wouldn't disappear on incorrect password submission on seed word reveal.
|
||||||
- Polish the private key UI.
|
- Polish the private key UI.
|
||||||
- Enforce minimum values for gas price and gas limit.
|
- Enforce minimum values for gas price and gas limit.
|
||||||
- Fix bug where total gas was sometimes not live-updated.
|
- Fix bug where total gas was sometimes not live-updated.
|
||||||
- Fix bug where editing gas value could have some abrupt behaviors (#1233)
|
- Fix bug where editing gas value could have some abrupt behaviors (#1233)
|
||||||
|
- Add Kovan as an option on our network list.
|
||||||
|
|
||||||
## 3.4.0 2017-3-8
|
## 3.4.0 2017-3-8
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
const MAINET_RPC_URL = 'https://mainnet.infura.io/metamask'
|
const MAINET_RPC_URL = 'https://mainnet.infura.io/metamask'
|
||||||
const TESTNET_RPC_URL = 'https://ropsten.infura.io/metamask'
|
const TESTNET_RPC_URL = 'https://ropsten.infura.io/metamask'
|
||||||
|
const KOVAN_RPC_URL = 'https://kovan.infura.io/metamask'
|
||||||
const DEFAULT_RPC_URL = TESTNET_RPC_URL
|
const DEFAULT_RPC_URL = TESTNET_RPC_URL
|
||||||
|
|
||||||
global.METAMASK_DEBUG = 'GULP_METAMASK_DEBUG'
|
global.METAMASK_DEBUG = 'GULP_METAMASK_DEBUG'
|
||||||
@ -10,5 +11,6 @@ module.exports = {
|
|||||||
mainnet: MAINET_RPC_URL,
|
mainnet: MAINET_RPC_URL,
|
||||||
testnet: TESTNET_RPC_URL,
|
testnet: TESTNET_RPC_URL,
|
||||||
morden: TESTNET_RPC_URL,
|
morden: TESTNET_RPC_URL,
|
||||||
|
kovan: KOVAN_RPC_URL,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -69,14 +69,10 @@ function shouldInjectWeb3 () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function isAllowedSuffix (testCase) {
|
function isAllowedSuffix (testCase) {
|
||||||
var prohibitedTypes = ['xml', 'pdf']
|
const doctype = window.document.doctype
|
||||||
var currentUrl = window.location.href
|
if (doctype) {
|
||||||
var currentRegex
|
return doctype.name === 'html'
|
||||||
for (let i = 0; i < prohibitedTypes.length; i++) {
|
} else {
|
||||||
currentRegex = new RegExp(`\.${prohibitedTypes[i]}$`)
|
return false
|
||||||
if (currentRegex.test(currentUrl)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ const normalize = require('eth-sig-util').normalize
|
|||||||
const TESTNET_RPC = MetamaskConfig.network.testnet
|
const TESTNET_RPC = MetamaskConfig.network.testnet
|
||||||
const MAINNET_RPC = MetamaskConfig.network.mainnet
|
const MAINNET_RPC = MetamaskConfig.network.mainnet
|
||||||
const MORDEN_RPC = MetamaskConfig.network.morden
|
const MORDEN_RPC = MetamaskConfig.network.morden
|
||||||
|
const KOVAN_RPC = MetamaskConfig.network.kovan
|
||||||
|
|
||||||
/* The config-manager is a convenience object
|
/* The config-manager is a convenience object
|
||||||
* wrapping a pojo-migrator.
|
* wrapping a pojo-migrator.
|
||||||
@ -150,6 +151,9 @@ ConfigManager.prototype.getCurrentRpcAddress = function () {
|
|||||||
case 'morden':
|
case 'morden':
|
||||||
return MORDEN_RPC
|
return MORDEN_RPC
|
||||||
|
|
||||||
|
case 'kovan':
|
||||||
|
return KOVAN_RPC
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return provider && provider.rpcTarget ? provider.rpcTarget : TESTNET_RPC
|
return provider && provider.rpcTarget ? provider.rpcTarget : TESTNET_RPC
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,8 @@ class EthereumStore extends ObservableStore {
|
|||||||
super({
|
super({
|
||||||
accounts: {},
|
accounts: {},
|
||||||
transactions: {},
|
transactions: {},
|
||||||
|
currentBlockNumber: '0',
|
||||||
|
currentBlockHash: '',
|
||||||
})
|
})
|
||||||
this._provider = opts.provider
|
this._provider = opts.provider
|
||||||
this._query = new EthQuery(this._provider)
|
this._query = new EthQuery(this._provider)
|
||||||
@ -69,6 +71,8 @@ class EthereumStore extends ObservableStore {
|
|||||||
_updateForBlock (block) {
|
_updateForBlock (block) {
|
||||||
const blockNumber = '0x' + block.number.toString('hex')
|
const blockNumber = '0x' + block.number.toString('hex')
|
||||||
this._currentBlockNumber = blockNumber
|
this._currentBlockNumber = blockNumber
|
||||||
|
this.updateState({ currentBlockNumber: parseInt(blockNumber) })
|
||||||
|
this.updateState({ currentBlockHash: `0x${block.hash.toString('hex')}`})
|
||||||
async.parallel([
|
async.parallel([
|
||||||
this._updateAccounts.bind(this),
|
this._updateAccounts.bind(this),
|
||||||
this._updateTransactions.bind(this, blockNumber),
|
this._updateTransactions.bind(this, blockNumber),
|
||||||
@ -129,4 +133,4 @@ class EthereumStore extends ObservableStore {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = EthereumStore
|
module.exports = EthereumStore
|
||||||
|
@ -60,7 +60,7 @@ JsonImportSubview.prototype.render = function () {
|
|||||||
},
|
},
|
||||||
}, 'Import'),
|
}, 'Import'),
|
||||||
|
|
||||||
error ? h('span.warning', error) : null,
|
error ? h('span.error', error) : null,
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -95,4 +95,3 @@ JsonImportSubview.prototype.createNewKeychain = function () {
|
|||||||
|
|
||||||
this.props.dispatch(actions.importNewAccount('JSON File', [ fileContents, password ]))
|
this.props.dispatch(actions.importNewAccount('JSON File', [ fileContents, password ]))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ PrivateKeyImportView.prototype.render = function () {
|
|||||||
},
|
},
|
||||||
}, 'Import'),
|
}, 'Import'),
|
||||||
|
|
||||||
error ? h('span.warning', error) : null,
|
error ? h('span.error', error) : null,
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -65,4 +65,3 @@ PrivateKeyImportView.prototype.createNewKeychain = function () {
|
|||||||
const privateKey = input.value
|
const privateKey = input.value
|
||||||
this.props.dispatch(actions.importNewAccount('Private Key', [ privateKey ]))
|
this.props.dispatch(actions.importNewAccount('Private Key', [ privateKey ]))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,11 +269,12 @@ function requestRevealSeed (password) {
|
|||||||
dispatch(actions.showLoadingIndication())
|
dispatch(actions.showLoadingIndication())
|
||||||
log.debug(`background.submitPassword`)
|
log.debug(`background.submitPassword`)
|
||||||
background.submitPassword(password, (err) => {
|
background.submitPassword(password, (err) => {
|
||||||
if (err) return dispatch(actions.displayWarning(err.message))
|
if (err) {
|
||||||
|
return dispatch(actions.displayWarning(err.message))
|
||||||
|
}
|
||||||
log.debug(`background.placeSeedWords`)
|
log.debug(`background.placeSeedWords`)
|
||||||
background.placeSeedWords((err) => {
|
background.placeSeedWords((err) => {
|
||||||
if (err) return dispatch(actions.displayWarning(err.message))
|
if (err) return dispatch(actions.displayWarning(err.message))
|
||||||
dispatch(actions.hideLoadingIndication())
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -296,10 +297,10 @@ function importNewAccount (strategy, args) {
|
|||||||
dispatch(actions.showLoadingIndication('This may take a while, be patient.'))
|
dispatch(actions.showLoadingIndication('This may take a while, be patient.'))
|
||||||
log.debug(`background.importAccountWithStrategy`)
|
log.debug(`background.importAccountWithStrategy`)
|
||||||
background.importAccountWithStrategy(strategy, args, (err) => {
|
background.importAccountWithStrategy(strategy, args, (err) => {
|
||||||
dispatch(actions.hideLoadingIndication())
|
|
||||||
if (err) return dispatch(actions.displayWarning(err.message))
|
if (err) return dispatch(actions.displayWarning(err.message))
|
||||||
log.debug(`background.getState`)
|
log.debug(`background.getState`)
|
||||||
background.getState((err, newState) => {
|
background.getState((err, newState) => {
|
||||||
|
dispatch(actions.hideLoadingIndication())
|
||||||
if (err) {
|
if (err) {
|
||||||
return dispatch(actions.displayWarning(err.message))
|
return dispatch(actions.displayWarning(err.message))
|
||||||
}
|
}
|
||||||
|
@ -255,6 +255,15 @@ App.prototype.renderNetworkDropdown = function () {
|
|||||||
provider: props.provider,
|
provider: props.provider,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
h(DropMenuItem, {
|
||||||
|
label: 'Kovan Test Network',
|
||||||
|
closeMenu: () => this.setState({ isNetworkMenuOpen: false}),
|
||||||
|
action: () => props.dispatch(actions.setProviderType('kovan')),
|
||||||
|
icon: h('.menu-icon.hollow-diamond'),
|
||||||
|
activeNetworkRender: props.network,
|
||||||
|
provider: props.provider,
|
||||||
|
}),
|
||||||
|
|
||||||
h(DropMenuItem, {
|
h(DropMenuItem, {
|
||||||
label: 'Localhost 8545',
|
label: 'Localhost 8545',
|
||||||
closeMenu: () => this.setState({ isNetworkMenuOpen: false }),
|
closeMenu: () => this.setState({ isNetworkMenuOpen: false }),
|
||||||
|
@ -52,6 +52,7 @@ ExportAccountView.prototype.render = function () {
|
|||||||
}, [
|
}, [
|
||||||
h('p.error', warning),
|
h('p.error', warning),
|
||||||
h('input#exportAccount.sizing-input', {
|
h('input#exportAccount.sizing-input', {
|
||||||
|
type: 'password',
|
||||||
placeholder: 'confirm password',
|
placeholder: 'confirm password',
|
||||||
onKeyPress: this.onExportKeyPress.bind(this),
|
onKeyPress: this.onExportKeyPress.bind(this),
|
||||||
style: {
|
style: {
|
||||||
|
@ -42,7 +42,10 @@ DropMenuItem.prototype.activeNetworkRender = function () {
|
|||||||
if (providerType === 'mainnet') return h('.check', '✓')
|
if (providerType === 'mainnet') return h('.check', '✓')
|
||||||
break
|
break
|
||||||
case 'Ropsten Test Network':
|
case 'Ropsten Test Network':
|
||||||
if (provider.type === 'testnet') return h('.check', '✓')
|
if (providerType === 'testnet') return h('.check', '✓')
|
||||||
|
break
|
||||||
|
case 'Kovan Test Network':
|
||||||
|
if (providerType === 'kovan') return h('.check', '✓')
|
||||||
break
|
break
|
||||||
case 'Localhost 8545':
|
case 'Localhost 8545':
|
||||||
if (activeNetwork === 'http://localhost:8545') return h('.check', '✓')
|
if (activeNetwork === 'http://localhost:8545') return h('.check', '✓')
|
||||||
|
@ -40,6 +40,9 @@ Network.prototype.render = function () {
|
|||||||
} else if (parseInt(networkNumber) === 3) {
|
} else if (parseInt(networkNumber) === 3) {
|
||||||
hoverText = 'Ropsten Test Network'
|
hoverText = 'Ropsten Test Network'
|
||||||
iconName = 'ropsten-test-network'
|
iconName = 'ropsten-test-network'
|
||||||
|
} else if (providerName === 'kovan') {
|
||||||
|
hoverText = 'Kovan Test Network'
|
||||||
|
iconName = 'kovan-test-network'
|
||||||
} else {
|
} else {
|
||||||
hoverText = 'Unknown Private Network'
|
hoverText = 'Unknown Private Network'
|
||||||
iconName = 'unknown-private-network'
|
iconName = 'unknown-private-network'
|
||||||
@ -70,6 +73,15 @@ Network.prototype.render = function () {
|
|||||||
}},
|
}},
|
||||||
'Ropsten Test Net'),
|
'Ropsten Test Net'),
|
||||||
])
|
])
|
||||||
|
case 'kovan-test-network':
|
||||||
|
return h('.network-indicator', [
|
||||||
|
h('.menu-icon.hollow-diamond'),
|
||||||
|
h('.network-name', {
|
||||||
|
style: {
|
||||||
|
color: '#690496',
|
||||||
|
}},
|
||||||
|
'Kovan Test Net'),
|
||||||
|
])
|
||||||
default:
|
default:
|
||||||
return h('.network-indicator', [
|
return h('.network-indicator', [
|
||||||
h('i.fa.fa-question-circle.fa-lg', {
|
h('i.fa.fa-question-circle.fa-lg', {
|
||||||
|
@ -28,7 +28,7 @@ TransactionListItem.prototype.render = function () {
|
|||||||
|
|
||||||
let isLinkable = false
|
let isLinkable = false
|
||||||
const numericNet = parseInt(network)
|
const numericNet = parseInt(network)
|
||||||
isLinkable = numericNet === 1 || numericNet === 3
|
isLinkable = numericNet === 1 || numericNet === 3 || numericNet === 42
|
||||||
|
|
||||||
var isMsg = ('msgParams' in transaction)
|
var isMsg = ('msgParams' in transaction)
|
||||||
var isTx = ('txParams' in transaction)
|
var isTx = ('txParams' in transaction)
|
||||||
|
@ -161,6 +161,11 @@ function currentProviderDisplay (metamaskState) {
|
|||||||
value = 'Ropsten Test Network'
|
value = 'Ropsten Test Network'
|
||||||
break
|
break
|
||||||
|
|
||||||
|
case 'kovan':
|
||||||
|
title = 'Current Network'
|
||||||
|
value = 'Kovan Test Network'
|
||||||
|
break
|
||||||
|
|
||||||
default:
|
default:
|
||||||
title = 'Current RPC'
|
title = 'Current RPC'
|
||||||
value = metamaskState.provider.rpcTarget
|
value = metamaskState.provider.rpcTarget
|
||||||
|
@ -188,7 +188,7 @@ hr.horizontal-line {
|
|||||||
|
|
||||||
.hollow-diamond {
|
.hollow-diamond {
|
||||||
transform: rotate(45deg);
|
transform: rotate(45deg);
|
||||||
border: 1px solid #038789;
|
border: 3px solid #690496;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pending-dot {
|
.pending-dot {
|
||||||
|
@ -426,6 +426,7 @@ function reduceApp (state, action) {
|
|||||||
case actions.DISPLAY_WARNING:
|
case actions.DISPLAY_WARNING:
|
||||||
return extend(appState, {
|
return extend(appState, {
|
||||||
warning: action.value,
|
warning: action.value,
|
||||||
|
isLoading: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
case actions.HIDE_WARNING:
|
case actions.HIDE_WARNING:
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
module.exports = function (address, network) {
|
module.exports = function (address, network) {
|
||||||
const net = parseInt(network)
|
const net = parseInt(network)
|
||||||
let link
|
let link
|
||||||
|
|
||||||
switch (net) {
|
switch (net) {
|
||||||
case 1: // main net
|
case 1: // main net
|
||||||
link = `http://etherscan.io/address/${address}`
|
link = `http://etherscan.io/address/${address}`
|
||||||
@ -12,6 +11,9 @@ module.exports = function (address, network) {
|
|||||||
case 3: // ropsten test net
|
case 3: // ropsten test net
|
||||||
link = `http://testnet.etherscan.io/address/${address}`
|
link = `http://testnet.etherscan.io/address/${address}`
|
||||||
break
|
break
|
||||||
|
case 42: // kovan test net
|
||||||
|
link = `http://kovan.etherscan.io/address/${address}`
|
||||||
|
break
|
||||||
default:
|
default:
|
||||||
link = ''
|
link = ''
|
||||||
break
|
break
|
||||||
|
@ -5,9 +5,12 @@ module.exports = function (hash, network) {
|
|||||||
case 1: // main net
|
case 1: // main net
|
||||||
prefix = ''
|
prefix = ''
|
||||||
break
|
break
|
||||||
case 3: // morden test net
|
case 3: // ropsten test net
|
||||||
prefix = 'testnet.'
|
prefix = 'testnet.'
|
||||||
break
|
break
|
||||||
|
case 42: // kovan test net
|
||||||
|
prefix = 'kovan.'
|
||||||
|
break
|
||||||
default:
|
default:
|
||||||
prefix = ''
|
prefix = ''
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user