Merge remote-tracking branch 'upstream/develop' into HEAD

feature/default_network_editable
Whymarrh Whitby 5 years ago
commit 3ba3eacbbd
  1. 4
      CHANGELOG.md
  2. 2
      app/manifest.json
  3. 4
      development/states/send-edit.json
  4. 6
      test/e2e/incremental-security.spec.js
  5. 9
      ui/app/components/app/multiple-notifications/multiple-notifications.component.js
  6. 12
      ui/app/ducks/app/app.js
  7. 3
      ui/app/helpers/constants/routes.js
  8. 11
      ui/app/pages/first-time-flow/first-time-flow.component.js
  9. 8
      ui/app/pages/first-time-flow/first-time-flow.container.js
  10. 11
      ui/app/pages/first-time-flow/seed-phrase/seed-phrase.component.js
  11. 13
      ui/app/pages/home/home.component.js
  12. 2
      ui/app/pages/home/home.container.js
  13. 2
      ui/app/pages/send/send-content/send-content.component.js
  14. 17
      ui/app/store/actions.js

@ -10,6 +10,10 @@
- [#6914](https://github.com/MetaMask/metamask-extension/pull/6914): Adds Address Book feature - [#6914](https://github.com/MetaMask/metamask-extension/pull/6914): Adds Address Book feature
- [#6928](https://github.com/MetaMask/metamask-extension/pull/6928): Disable Copy Tx ID and block explorer link for transactions without hash - [#6928](https://github.com/MetaMask/metamask-extension/pull/6928): Disable Copy Tx ID and block explorer link for transactions without hash
## 6.7.3 Thu Jul 18 2019
- [#6888](https://github.com/MetaMask/metamask-extension/pull/6888): Fix bug with resubmitting unsigned transactions.
## 6.7.2 Mon Jul 01 2019 ## 6.7.2 Mon Jul 01 2019
- [#6713](https://github.com/MetaMask/metamask-extension/pull/6713): * Normalize and Validate txParams in TransactionStateManager.addTx too - [#6713](https://github.com/MetaMask/metamask-extension/pull/6713): * Normalize and Validate txParams in TransactionStateManager.addTx too

@ -1,7 +1,7 @@
{ {
"name": "__MSG_appName__", "name": "__MSG_appName__",
"short_name": "__MSG_appName__", "short_name": "__MSG_appName__",
"version": "6.7.2", "version": "6.7.3",
"manifest_version": 2, "manifest_version": 2,
"author": "https://metamask.io", "author": "https://metamask.io",
"description": "__MSG_appDescription__", "description": "__MSG_appDescription__",

@ -182,7 +182,9 @@
"warnings": {} "warnings": {}
}, },
"confirmTransaction": { "confirmTransaction": {
"txData": {}, "txData": {
"id": 4768706228115573
},
"tokenData": {}, "tokenData": {},
"methodData": {}, "methodData": {},
"tokenProps": { "tokenProps": {

@ -280,6 +280,12 @@ describe('MetaMask', function () {
await delay(regularDelayMs) await delay(regularDelayMs)
}) })
it('can click through the success screen', async () => {
const confirm = await findElement(driver, By.xpath(`//button[contains(text(), 'All Done')]`))
await confirm.click()
await delay(regularDelayMs)
})
it('should have the correct amount of eth', async () => { it('should have the correct amount of eth', async () => {
const balances = await findElements(driver, By.css('.currency-display-component__text')) const balances = await findElements(driver, By.css('.currency-display-component__text'))
await driver.wait(until.elementTextMatches(balances[0], /1/), 15000) await driver.wait(until.elementTextMatches(balances[0], /1/), 15000)

@ -16,21 +16,20 @@ export default class MultipleNotifications extends PureComponent {
const { showAll } = this.state const { showAll } = this.state
const { notifications, classNames = [] } = this.props const { notifications, classNames = [] } = this.props
const notificationsToBeRendered = notifications.filter(notificationConfig => notificationConfig.shouldBeRendered)
return (<div return (<div
className={classnames(...classNames, { className={classnames(...classNames, {
'home-notification-wrapper--show-all': showAll, 'home-notification-wrapper--show-all': showAll,
'home-notification-wrapper--show-first': !showAll, 'home-notification-wrapper--show-first': !showAll,
})} })}
> >
{notifications { notificationsToBeRendered.map(notificationConfig => notificationConfig.component) }
.filter(notificationConfig => notificationConfig.shouldBeRendered)
.map(notificationConfig => notificationConfig.component)
}
<div <div
className="home-notification-wrapper__i-container" className="home-notification-wrapper__i-container"
onClick={() => this.setState({ showAll: !showAll })} onClick={() => this.setState({ showAll: !showAll })}
> >
{notifications.length > 1 ? <i className={classnames('fa fa-sm fa-sort-amount-asc', { {notificationsToBeRendered.length > 1 ? <i className={classnames('fa fa-sm fa-sort-amount-asc', {
'flipped': !showAll, 'flipped': !showAll,
})} /> : null} })} /> : null}
</div> </div>

@ -73,7 +73,6 @@ function reduceApp (state, action) {
networksTabSelectedRpcUrl: '', networksTabSelectedRpcUrl: '',
networksTabIsInAddMode: false, networksTabIsInAddMode: false,
loadingMethodData: false, loadingMethodData: false,
showingSeedPhraseBackupAfterOnboarding: false,
}, state.appState) }, state.appState)
switch (action.type) { switch (action.type) {
@ -757,17 +756,6 @@ function reduceApp (state, action) {
loadingMethodData: false, loadingMethodData: false,
}) })
case actions.SHOW_SEED_PHRASE_BACKUP_AFTER_ONBOARDING:
return extend(appState, {
showingSeedPhraseBackupAfterOnboarding: true,
})
case actions.HIDE_SEED_PHRASE_BACKUP_AFTER_ONBOARDING:
return extend(appState, {
showingSeedPhraseBackupAfterOnboarding: false,
})
default: default:
return appState return appState
} }

@ -32,6 +32,7 @@ const INITIALIZE_CREATE_PASSWORD_ROUTE = '/initialize/create-password'
const INITIALIZE_IMPORT_WITH_SEED_PHRASE_ROUTE = '/initialize/create-password/import-with-seed-phrase' const INITIALIZE_IMPORT_WITH_SEED_PHRASE_ROUTE = '/initialize/create-password/import-with-seed-phrase'
const INITIALIZE_SELECT_ACTION_ROUTE = '/initialize/select-action' const INITIALIZE_SELECT_ACTION_ROUTE = '/initialize/select-action'
const INITIALIZE_SEED_PHRASE_ROUTE = '/initialize/seed-phrase' const INITIALIZE_SEED_PHRASE_ROUTE = '/initialize/seed-phrase'
const INITIALIZE_BACKUP_SEED_PHRASE_ROUTE = '/initialize/backup-seed-phrase'
const INITIALIZE_END_OF_FLOW_ROUTE = '/initialize/end-of-flow' const INITIALIZE_END_OF_FLOW_ROUTE = '/initialize/end-of-flow'
const INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE = '/initialize/seed-phrase/confirm' const INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE = '/initialize/seed-phrase/confirm'
const INITIALIZE_METAMETRICS_OPT_IN_ROUTE = '/initialize/metametrics-opt-in' const INITIALIZE_METAMETRICS_OPT_IN_ROUTE = '/initialize/metametrics-opt-in'
@ -90,4 +91,6 @@ module.exports = {
CONTACT_MY_ACCOUNTS_VIEW_ROUTE, CONTACT_MY_ACCOUNTS_VIEW_ROUTE,
CONTACT_MY_ACCOUNTS_EDIT_ROUTE, CONTACT_MY_ACCOUNTS_EDIT_ROUTE,
NETWORKS_ROUTE, NETWORKS_ROUTE,
INITIALIZE_BACKUP_SEED_PHRASE_ROUTE,
} }

@ -18,6 +18,7 @@ import {
INITIALIZE_SELECT_ACTION_ROUTE, INITIALIZE_SELECT_ACTION_ROUTE,
INITIALIZE_END_OF_FLOW_ROUTE, INITIALIZE_END_OF_FLOW_ROUTE,
INITIALIZE_METAMETRICS_OPT_IN_ROUTE, INITIALIZE_METAMETRICS_OPT_IN_ROUTE,
INITIALIZE_BACKUP_SEED_PHRASE_ROUTE,
} from '../../helpers/constants/routes' } from '../../helpers/constants/routes'
export default class FirstTimeFlow extends PureComponent { export default class FirstTimeFlow extends PureComponent {
@ -113,6 +114,16 @@ export default class FirstTimeFlow extends PureComponent {
/> />
)} )}
/> />
<Route
path={INITIALIZE_BACKUP_SEED_PHRASE_ROUTE}
render={props => (
<SeedPhrase
{ ...props }
seedPhrase={seedPhrase}
verifySeedPhrase={verifySeedPhrase}
/>
)}
/>
<Route <Route
path={INITIALIZE_CREATE_PASSWORD_ROUTE} path={INITIALIZE_CREATE_PASSWORD_ROUTE}
render={props => ( render={props => (

@ -7,9 +7,13 @@ import {
unlockAndGetSeedPhrase, unlockAndGetSeedPhrase,
verifySeedPhrase, verifySeedPhrase,
} from '../../store/actions' } from '../../store/actions'
import {
INITIALIZE_BACKUP_SEED_PHRASE_ROUTE,
} from '../../helpers/constants/routes'
const mapStateToProps = state => { const mapStateToProps = (state, ownProps) => {
const { metamask: { completedOnboarding, isInitialized, isUnlocked, seedPhraseBackedUp }, appState: { showingSeedPhraseBackupAfterOnboarding } } = state const { metamask: { completedOnboarding, isInitialized, isUnlocked, seedPhraseBackedUp } } = state
const showingSeedPhraseBackupAfterOnboarding = Boolean(ownProps.location.pathname.match(INITIALIZE_BACKUP_SEED_PHRASE_ROUTE))
return { return {
completedOnboarding, completedOnboarding,

@ -6,6 +6,7 @@ import ConfirmSeedPhrase from './confirm-seed-phrase'
import { import {
INITIALIZE_SEED_PHRASE_ROUTE, INITIALIZE_SEED_PHRASE_ROUTE,
INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE, INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE,
INITIALIZE_BACKUP_SEED_PHRASE_ROUTE,
DEFAULT_ROUTE, DEFAULT_ROUTE,
} from '../../../helpers/constants/routes' } from '../../../helpers/constants/routes'
import HTML5Backend from 'react-dnd-html5-backend' import HTML5Backend from 'react-dnd-html5-backend'
@ -68,6 +69,16 @@ export default class SeedPhrase extends PureComponent {
/> />
)} )}
/> />
<Route
exact
path={INITIALIZE_BACKUP_SEED_PHRASE_ROUTE}
render={props => (
<RevealSeedPhrase
{ ...props }
seedPhrase={seedPhrase || verifiedSeedPhrase}
/>
)}
/>
</Switch> </Switch>
</div> </div>
</DragDropContextProvider> </DragDropContextProvider>

@ -12,7 +12,7 @@ import {
RESTORE_VAULT_ROUTE, RESTORE_VAULT_ROUTE,
CONFIRM_TRANSACTION_ROUTE, CONFIRM_TRANSACTION_ROUTE,
CONFIRM_ADD_SUGGESTED_TOKEN_ROUTE, CONFIRM_ADD_SUGGESTED_TOKEN_ROUTE,
INITIALIZE_SEED_PHRASE_ROUTE, INITIALIZE_BACKUP_SEED_PHRASE_ROUTE,
} from '../../helpers/constants/routes' } from '../../helpers/constants/routes'
export default class Home extends PureComponent { export default class Home extends PureComponent {
@ -43,8 +43,8 @@ export default class Home extends PureComponent {
viewingUnconnectedDapp: PropTypes.bool.isRequired, viewingUnconnectedDapp: PropTypes.bool.isRequired,
forceApproveProviderRequestByOrigin: PropTypes.func, forceApproveProviderRequestByOrigin: PropTypes.func,
shouldShowSeedPhraseReminder: PropTypes.bool, shouldShowSeedPhraseReminder: PropTypes.bool,
showSeedPhraseBackupAfterOnboarding: PropTypes.bool,
rejectProviderRequestByOrigin: PropTypes.func, rejectProviderRequestByOrigin: PropTypes.func,
isPopup: PropTypes.bool,
} }
componentWillMount () { componentWillMount () {
@ -82,8 +82,8 @@ export default class Home extends PureComponent {
viewingUnconnectedDapp, viewingUnconnectedDapp,
forceApproveProviderRequestByOrigin, forceApproveProviderRequestByOrigin,
shouldShowSeedPhraseReminder, shouldShowSeedPhraseReminder,
showSeedPhraseBackupAfterOnboarding,
rejectProviderRequestByOrigin, rejectProviderRequestByOrigin,
isPopup,
} = this.props } = this.props
if (forgottenPassword) { if (forgottenPassword) {
@ -140,8 +140,11 @@ export default class Home extends PureComponent {
descriptionText={t('backupApprovalNotice')} descriptionText={t('backupApprovalNotice')}
acceptText={t('backupNow')} acceptText={t('backupNow')}
onAccept={() => { onAccept={() => {
showSeedPhraseBackupAfterOnboarding() if (isPopup) {
history.push(INITIALIZE_SEED_PHRASE_ROUTE) global.platform.openExtensionInBrowser(INITIALIZE_BACKUP_SEED_PHRASE_ROUTE)
} else {
history.push(INITIALIZE_BACKUP_SEED_PHRASE_ROUTE)
}
}} }}
infoText={t('backupApprovalInfo')} infoText={t('backupApprovalInfo')}
key="home-backupApprovalNotice" key="home-backupApprovalNotice"

@ -7,7 +7,6 @@ import { getCurrentEthBalance } from '../../selectors/selectors'
import { import {
forceApproveProviderRequestByOrigin, forceApproveProviderRequestByOrigin,
unsetMigratedPrivacyMode, unsetMigratedPrivacyMode,
showSeedPhraseBackupAfterOnboarding,
rejectProviderRequestByOrigin, rejectProviderRequestByOrigin,
} from '../../store/actions' } from '../../store/actions'
import { getEnvironmentType } from '../../../../app/scripts/lib/util' import { getEnvironmentType } from '../../../../app/scripts/lib/util'
@ -60,7 +59,6 @@ const mapDispatchToProps = (dispatch) => ({
unsetMigratedPrivacyMode: () => dispatch(unsetMigratedPrivacyMode()), unsetMigratedPrivacyMode: () => dispatch(unsetMigratedPrivacyMode()),
forceApproveProviderRequestByOrigin: (origin) => dispatch(forceApproveProviderRequestByOrigin(origin)), forceApproveProviderRequestByOrigin: (origin) => dispatch(forceApproveProviderRequestByOrigin(origin)),
rejectProviderRequestByOrigin: origin => dispatch(rejectProviderRequestByOrigin(origin)), rejectProviderRequestByOrigin: origin => dispatch(rejectProviderRequestByOrigin(origin)),
showSeedPhraseBackupAfterOnboarding: () => dispatch(showSeedPhraseBackupAfterOnboarding()),
}) })
export default compose( export default compose(

@ -48,7 +48,7 @@ export default class SendContent extends Component {
maybeRenderAddContact () { maybeRenderAddContact () {
const { t } = this.context const { t } = this.context
const { to, addressBook = [], ownedAccounts = [], showAddToAddressBookModal } = this.props const { to, addressBook = [], ownedAccounts = [], showAddToAddressBookModal } = this.props
const isOwnedAccount = !!ownedAccounts.find(({ address }) => address === to) const isOwnedAccount = !!ownedAccounts.find(({ address }) => address.toLowerCase() === to.toLowerCase())
const contact = addressBook.find(({ address }) => address === to) || {} const contact = addressBook.find(({ address }) => address === to) || {}
if (isOwnedAccount || contact.name) { if (isOwnedAccount || contact.name) {

@ -377,11 +377,6 @@ var actions = {
LOADING_TOKEN_PARAMS_FINISHED: 'LOADING_TOKEN_PARAMS_FINISHED', LOADING_TOKEN_PARAMS_FINISHED: 'LOADING_TOKEN_PARAMS_FINISHED',
setSeedPhraseBackedUp, setSeedPhraseBackedUp,
showSeedPhraseBackupAfterOnboarding,
SHOW_SEED_PHRASE_BACKUP_AFTER_ONBOARDING: 'SHOW_SEED_PHRASE_BACKUP_AFTER_ONBOARDING',
hideSeedPhraseBackupAfterOnboarding,
HIDE_SEED_PHRASE_BACKUP_AFTER_ONBOARDING: 'HIDE_SEED_PHRASE_BACKUP_AFTER_ONBOARDING',
verifySeedPhrase, verifySeedPhrase,
SET_SEED_PHRASE_BACKED_UP_TO_TRUE: 'SET_SEED_PHRASE_BACKED_UP_TO_TRUE', SET_SEED_PHRASE_BACKED_UP_TO_TRUE: 'SET_SEED_PHRASE_BACKED_UP_TO_TRUE',
} }
@ -2796,15 +2791,3 @@ function setSeedPhraseBackedUp (seedPhraseBackupState) {
}) })
} }
} }
function showSeedPhraseBackupAfterOnboarding () {
return {
type: actions.SHOW_SEED_PHRASE_BACKUP_AFTER_ONBOARDING,
}
}
function hideSeedPhraseBackupAfterOnboarding () {
return {
type: actions.HIDE_SEED_PHRASE_BACKUP_AFTER_ONBOARDING,
}
}

Loading…
Cancel
Save