Merge pull request #2530 from MetaMask/uat

Merge uat into NewUI-flat
feature/default_network_editable
Chi Kei Chan 7 years ago committed by GitHub
commit 9f70762434
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      app/manifest.json
  2. 2
      app/scripts/controllers/preferences.js
  3. 4
      package.json
  4. 35
      test/integration/lib/first-time.js
  5. 24
      test/integration/lib/mascara-first-time.js
  6. 11
      test/lib/shallow-with-store.js
  7. 29
      test/unit/components/balance-component-test.js
  8. 60
      test/unit/components/pending-tx-test.js
  9. 1
      test/unit/pending-tx-test.js
  10. 104
      test/unit/responsive/components/dropdown-test.js
  11. 8
      ui/app/actions.js
  12. 7
      ui/app/app.js
  13. 7
      ui/app/components/customize-gas-modal/gas-modal-card.js
  14. 74
      ui/app/components/customize-gas-modal/gas-slider.js
  15. 7
      ui/app/components/customize-gas-modal/index.js
  16. 7
      ui/app/components/dropdowns/account-dropdown-mini.js
  17. 2
      ui/app/components/dropdowns/account-options-dropdown.js
  18. 2
      ui/app/components/dropdowns/account-selection-dropdown.js
  19. 15
      ui/app/components/dropdowns/components/account-dropdowns.js
  20. 1
      ui/app/components/dropdowns/components/dropdown.js
  21. 3
      ui/app/components/dropdowns/simple-dropdown.js
  22. 4
      ui/app/components/dropdowns/token-menu-dropdown.js
  23. 5
      ui/app/components/loading.js
  24. 2
      ui/app/components/modals/account-details-modal.js
  25. 1
      ui/app/components/modals/export-private-key-modal.js
  26. 2
      ui/app/components/modals/modal.js
  27. 2
      ui/app/components/modals/shapeshift-deposit-tx-modal.js
  28. 2
      ui/app/components/network.js
  29. 4
      ui/app/components/pending-tx/confirm-send-token.js
  30. 7
      ui/app/components/send-token/index.js
  31. 11
      ui/app/components/send/currency-display.js
  32. 4
      ui/app/components/send/eth-fee-display.js
  33. 7
      ui/app/components/send/from-dropdown.js
  34. 7
      ui/app/components/send/gas-fee-display-v2.js
  35. 58
      ui/app/components/send/memo-textarea.js
  36. 1
      ui/app/components/send/send-constants.js
  37. 1
      ui/app/components/send/send-utils.js
  38. 14
      ui/app/components/send/send-v2-container.js
  39. 12
      ui/app/components/send/to-autocomplete.js
  40. 4
      ui/app/components/send/usd-fee-display.js
  41. 29
      ui/app/components/signature-request.js
  42. 7
      ui/app/components/tab-bar.js
  43. 8
      ui/app/components/token-cell.js
  44. 26
      ui/app/components/token-list.js
  45. 4
      ui/app/components/transaction-list-item.js
  46. 6
      ui/app/components/tx-list-item.js
  47. 10
      ui/app/components/tx-list.js
  48. 2
      ui/app/conf-tx.js
  49. 14
      ui/app/conversion-util.js
  50. 2
      ui/app/reducers/app.js
  51. 2
      ui/app/reducers/metamask.js
  52. 12
      ui/app/send-v2.js
  53. 1094
      ui/app/send.js

@ -1,7 +1,7 @@
{ {
"name": "MetaMask", "name": "MetaMask",
"short_name": "Metamask", "short_name": "Metamask",
"version": "3.11.2", "version": "4.0.3",
"manifest_version": 2, "manifest_version": 2,
"author": "https://metamask.io", "author": "https://metamask.io",
"description": "Ethereum Browser Extension", "description": "Ethereum Browser Extension",

@ -46,8 +46,6 @@ class PreferencesController {
} }
removeToken (rawAddress) { removeToken (rawAddress) {
const address = normalizeAddress(rawAddress)
const tokens = this.store.getState().tokens const tokens = this.store.getState().tokens
const updatedTokens = tokens.filter(token => token.address !== rawAddress) const updatedTokens = tokens.filter(token => token.address !== rawAddress)

@ -15,7 +15,7 @@
"test": "npm run lint && npm run test:coverage && npm run test:integration", "test": "npm run lint && npm run test:coverage && npm run test:integration",
"test:unit": "METAMASK_ENV=test mocha --compilers js:babel-core/register --require test/helper.js --recursive \"test/unit/**/*.js\"", "test:unit": "METAMASK_ENV=test mocha --compilers js:babel-core/register --require test/helper.js --recursive \"test/unit/**/*.js\"",
"test:single": "METAMASK_ENV=test mocha --require test/helper.js", "test:single": "METAMASK_ENV=test mocha --require test/helper.js",
"test:integration": "npm run test:flat && npm run test:mascara", "test:integration": "gulp build:scss && npm run test:flat && npm run test:mascara",
"test:coverage": "nyc npm run test:unit && npm run test:coveralls-upload", "test:coverage": "nyc npm run test:unit && npm run test:coveralls-upload",
"test:coveralls-upload": "if [ $COVERALLS_REPO_TOKEN ]; then nyc report --reporter=text-lcov | coveralls; fi", "test:coveralls-upload": "if [ $COVERALLS_REPO_TOKEN ]; then nyc report --reporter=text-lcov | coveralls; fi",
"test:flat": "npm run test:flat:build && karma start test/flat.conf.js", "test:flat": "npm run test:flat:build && karma start test/flat.conf.js",
@ -190,6 +190,7 @@
"enzyme": "^2.8.2", "enzyme": "^2.8.2",
"eslint-plugin-chai": "0.0.1", "eslint-plugin-chai": "0.0.1",
"eslint-plugin-mocha": "^4.9.0", "eslint-plugin-mocha": "^4.9.0",
"eslint-plugin-react": "^7.4.0",
"eth-json-rpc-middleware": "^1.2.7", "eth-json-rpc-middleware": "^1.2.7",
"fs-promise": "^2.0.3", "fs-promise": "^2.0.3",
"gulp": "github:gulpjs/gulp#4.0", "gulp": "github:gulpjs/gulp#4.0",
@ -226,6 +227,7 @@
"react-addons-test-utils": "^15.5.1", "react-addons-test-utils": "^15.5.1",
"react-test-renderer": "^15.5.4", "react-test-renderer": "^15.5.4",
"react-testutils-additions": "^15.2.0", "react-testutils-additions": "^15.2.0",
"redux-test-utils": "^0.1.3",
"sinon": "^4.0.0", "sinon": "^4.0.0",
"stylelint-config-standard": "^17.0.0", "stylelint-config-standard": "^17.0.0",
"tape": "^4.5.1", "tape": "^4.5.1",

@ -40,7 +40,8 @@ async function runFirstTimeUsageTest(assert, done) {
// Scroll through terms // Scroll through terms
const title = app.find('h1').text() const title = app.find('h1').text()
assert.equal(title, 'MetaMask', 'title screen') // TODO Find where Metamask is getting added twice in the title
assert.equal(title, 'MetaMaskMetaMask', 'title screen')
// enter password // enter password
const pwBox = app.find('#password-box')[0] const pwBox = app.find('#password-box')[0]
@ -66,17 +67,17 @@ async function runFirstTimeUsageTest(assert, done) {
await timeout(1000) await timeout(1000)
const detail = app.find('.account-detail-section')[0] const detail = app.find('.wallet-view')[0]
assert.ok(detail, 'Account detail section loaded.') assert.ok(detail, 'Account detail section loaded.')
const sandwich = app.find('.sandwich-expando')[0] await timeout(1000)
sandwich.click()
await timeout() const menu = app.find('.account-menu__icon')[0]
menu.click()
await timeout(1000)
const menu = app.find('.menu-droppo')[0] const lock = app.find('.account-menu__logout-button')[0]
const children = menu.children
const lock = children[children.length - 2]
assert.ok(lock, 'Lock menu item found') assert.ok(lock, 'Lock menu item found')
lock.click() lock.click()
@ -90,36 +91,30 @@ async function runFirstTimeUsageTest(assert, done) {
await timeout(1000) await timeout(1000)
const detail2 = app.find('.account-detail-section')[0] const detail2 = app.find('.wallet-view')[0]
assert.ok(detail2, 'Account detail section loaded again.') assert.ok(detail2, 'Account detail section loaded again.')
await timeout() await timeout()
// open account settings dropdown // open account settings dropdown
const qrButton = app.find('.fa.fa-ellipsis-h')[0] const qrButton = app.find('.wallet-view__details-button')[0]
qrButton.click() qrButton.click()
await timeout(1000) await timeout(1000)
// qr code item const qrHeader = app.find('.editable-label__value')[0]
const qrButton2 = app.find('.dropdown-menu-item')[1] const qrContainer = app.find('.qr-wrapper')[0]
qrButton2.click()
await timeout(1000)
const qrHeader = app.find('.qr-header')[0]
const qrContainer = app.find('#qr-container')[0]
assert.equal(qrHeader.textContent, 'Account 1', 'Should show account label.') assert.equal(qrHeader.textContent, 'Account 1', 'Should show account label.')
assert.ok(qrContainer, 'QR Container found') assert.ok(qrContainer, 'QR Container found')
await timeout() await timeout()
const networkMenu = app.find('.network-indicator')[0] const networkMenu = app.find('.network-component')[0]
networkMenu.click() networkMenu.click()
await timeout() await timeout()
const networkMenu2 = app.find('.network-indicator')[0] const networkMenu2 = app.find('.menu-droppo')[0]
const children2 = networkMenu2.children const children2 = networkMenu2.children
children2.length[3] children2.length[3]
assert.ok(children2, 'All network options present') assert.ok(children2, 'All network options present')

@ -102,14 +102,12 @@ async function runFirstTimeUsageTest (assert, done) {
app.find('.buy-ether__do-it-later').click() app.find('.buy-ether__do-it-later').click()
await timeout(1000) await timeout(1000)
const sandwich = app.find('.sandwich-expando')[0] const menu = app.find('.account-menu__icon')[0]
sandwich.click() menu.click()
await timeout() await timeout()
const menu = app.find('.menu-droppo')[0] const lock = app.find('.account-menu__logout-button')[0]
const children = menu.children
const lock = children[children.length - 2]
assert.ok(lock, 'Lock menu item found') assert.ok(lock, 'Lock menu item found')
lock.click() lock.click()
@ -123,31 +121,25 @@ async function runFirstTimeUsageTest (assert, done) {
await timeout(1000) await timeout(1000)
const detail2 = app.find('.account-detail-section')[0] const detail2 = app.find('.wallet-view')[0]
assert.ok(detail2, 'Account detail section loaded again.') assert.ok(detail2, 'Account detail section loaded again.')
await timeout() await timeout()
// open account settings dropdown // open account settings dropdown
const qrButton = app.find('.fa.fa-ellipsis-h')[0] const qrButton = app.find('.wallet-view__details-button')[0]
qrButton.click() qrButton.click()
await timeout(1000) await timeout(1000)
// qr code item const qrHeader = app.find('.editable-label__value')[0]
const qrButton2 = app.find('.dropdown-menu-item')[1] const qrContainer = app.find('.qr-wrapper')[0]
qrButton2.click()
await timeout(1000)
const qrHeader = app.find('.qr-header')[0]
const qrContainer = app.find('#qr-container')[0]
assert.equal(qrHeader.textContent, 'Account 1', 'Should show account label.') assert.equal(qrHeader.textContent, 'Account 1', 'Should show account label.')
assert.ok(qrContainer, 'QR Container found') assert.ok(qrContainer, 'QR Container found')
await timeout() await timeout()
const networkMenu = app.find('.network-indicator')[0] const networkMenu = app.find('.network-component')[0]
networkMenu.click() networkMenu.click()
await timeout() await timeout()

@ -0,0 +1,11 @@
const shallow = require('enzyme').shallow
module.exports = shallowWithStore
function shallowWithStore (component, store) {
const context = {
store,
}
return shallow(component, { context })
};

@ -1,18 +1,31 @@
var assert = require('assert') const assert = require('assert')
var BalanceComponent = require('../../../ui/app/components/balance-component') const h = require('react-hyperscript')
const { createMockStore } = require('redux-test-utils')
const shallowWithStore = require('../../lib/shallow-with-store')
const BalanceComponent = require('../../../ui/app/components/balance-component')
const mockState = {
metamask: {
accounts: { abc: {} },
network: 1,
selectedAddress: 'abc',
}
}
describe('BalanceComponent', function () { describe('BalanceComponent', function () {
let balanceComponent let balanceComponent
let store
let component
beforeEach(function () { beforeEach(function () {
balanceComponent = new BalanceComponent() store = createMockStore(mockState)
component = shallowWithStore(h(BalanceComponent), store)
balanceComponent = component.dive()
}) })
it('shows token balance and convert to fiat value based on conversion rate', function () { it('shows token balance and convert to fiat value based on conversion rate', function () {
const formattedBalance = '1.23 ETH' const formattedBalance = '1.23 ETH'
const tokenBalance = balanceComponent.getTokenBalance(formattedBalance, false) const tokenBalance = balanceComponent.instance().getTokenBalance(formattedBalance, false)
const fiatDisplayNumber = balanceComponent.getFiatDisplayNumber(formattedBalance, 2) const fiatDisplayNumber = balanceComponent.instance().getFiatDisplayNumber(formattedBalance, 2)
assert.equal('1.23 ETH', tokenBalance) assert.equal('1.23 ETH', tokenBalance)
assert.equal(2.46, fiatDisplayNumber) assert.equal(2.46, fiatDisplayNumber)
@ -21,8 +34,8 @@ describe('BalanceComponent', function () {
it('shows only the token balance when conversion rate is not available', function () { it('shows only the token balance when conversion rate is not available', function () {
const formattedBalance = '1.23 ETH' const formattedBalance = '1.23 ETH'
const tokenBalance = balanceComponent.getTokenBalance(formattedBalance, false) const tokenBalance = balanceComponent.instance().getTokenBalance(formattedBalance, false)
const fiatDisplayNumber = balanceComponent.getFiatDisplayNumber(formattedBalance, 0) const fiatDisplayNumber = balanceComponent.instance().getFiatDisplayNumber(formattedBalance, 0)
assert.equal('1.23 ETH', tokenBalance) assert.equal('1.23 ETH', tokenBalance)
assert.equal('N/A', fiatDisplayNumber) assert.equal('N/A', fiatDisplayNumber)

@ -1,18 +1,22 @@
const assert = require('assert') const assert = require('assert')
const additions = require('react-testutils-additions')
const h = require('react-hyperscript') const h = require('react-hyperscript')
const PendingTx = require('../../../ui/app/components/pending-tx') const PendingTx = require('../../../ui/app/components/pending-tx')
const ReactTestUtils = require('react-addons-test-utils')
const ethUtil = require('ethereumjs-util') const ethUtil = require('ethereumjs-util')
describe('PendingTx', function () { const { createMockStore } = require('redux-test-utils')
const identities = { const shallowWithStore = require('../../lib/shallow-with-store')
'0xfdea65c8e26263f6d9a1b5de9555d2931a33b826': {
name: 'Main Account 1', const identities = { abc: {}, def: {} }
balance: '0x00000000000000056bc75e2d63100000', const mockState = {
}, metamask: {
accounts: { abc: {} },
identities,
conversionRate: 10,
selectedAddress: 'abc',
}
} }
describe('PendingTx', function () {
const gasPrice = '0x4A817C800' // 20 Gwei const gasPrice = '0x4A817C800' // 20 Gwei
const txData = { const txData = {
'id': 5021615666270214, 'id': 5021615666270214,
@ -29,10 +33,6 @@ describe('PendingTx', function () {
'gasLimitSpecified': false, 'gasLimitSpecified': false,
'estimatedGas': '0x5208', 'estimatedGas': '0x5208',
} }
it('should use updated values when edited.', function (done) {
const renderer = ReactTestUtils.createRenderer()
const newGasPrice = '0x77359400' const newGasPrice = '0x77359400'
const computedBalances = {} const computedBalances = {}
@ -40,8 +40,6 @@ describe('PendingTx', function () {
ethBalance: '0x00000000000000056bc75e2d63100000', ethBalance: '0x00000000000000056bc75e2d63100000',
} }
const props = { const props = {
identities,
accounts: identities,
txData, txData,
computedBalances, computedBalances,
sendTransaction: (txMeta, event) => { sendTransaction: (txMeta, event) => {
@ -49,35 +47,21 @@ describe('PendingTx', function () {
const result = ethUtil.addHexPrefix(txMeta.txParams.gasPrice) const result = ethUtil.addHexPrefix(txMeta.txParams.gasPrice)
assert.notEqual(result, gasPrice, 'gas price should change') assert.notEqual(result, gasPrice, 'gas price should change')
assert.equal(result, newGasPrice, 'gas price assigned.') assert.equal(result, newGasPrice, 'gas price assigned.')
done()
}, },
} }
const pendingTxComponent = h(PendingTx, props) let pendingTxComponent
const component = additions.renderIntoDocument(pendingTxComponent) let store
renderer.render(pendingTxComponent) let component
const result = renderer.getRenderOutput() beforeEach(function () {
assert.equal(result.type, 'div', 'should create a div') store = createMockStore(mockState)
component = shallowWithStore(h(PendingTx, props), store)
try { pendingTxComponent = component
const input = additions.find(component, '.cell.row input[type="number"]')[1]
ReactTestUtils.Simulate.change(input, {
target: {
value: 2,
checkValidity () { return true },
},
}) })
const form = additions.find(component, 'form')[0] it('should render correctly', function (done) {
form.checkValidity = () => true assert.equal(pendingTxComponent.props().identities, identities)
form.getFormEl = () => { return { checkValidity () { return true } } } done()
ReactTestUtils.Simulate.submit(form, { preventDefault () {}, target: { checkValidity () {
return true
} } })
} catch (e) {
console.log('WHAAAA')
console.error(e)
}
}) })
}) })

@ -12,6 +12,7 @@ const currentNetworkId = 42
const otherNetworkId = 36 const otherNetworkId = 36
const privKey = new Buffer('8718b9618a37d1fc78c436511fc6df3c8258d3250635bba617f33003270ec03e', 'hex') const privKey = new Buffer('8718b9618a37d1fc78c436511fc6df3c8258d3250635bba617f33003270ec03e', 'hex')
describe('PendingTransactionTracker', function () { describe('PendingTransactionTracker', function () {
let pendingTxTracker, txMeta, txMetaNoHash, txMetaNoRawTx, providerResultStub, let pendingTxTracker, txMeta, txMetaNoHash, txMetaNoRawTx, providerResultStub,
provider, txMeta3, txList, knownErrors provider, txMeta3, txList, knownErrors

@ -1,26 +1,24 @@
var assert = require('assert'); const assert = require('assert');
const additions = require('react-testutils-additions');
const h = require('react-hyperscript'); const h = require('react-hyperscript');
const ReactTestUtils = require('react-addons-test-utils');
const sinon = require('sinon'); const sinon = require('sinon');
const path = require('path'); const path = require('path');
const Dropdown = require(path.join(__dirname, '..', '..', '..', '..', 'ui', 'app', 'components', 'dropdown.js')).Dropdown; const Dropdown = require(path.join(__dirname, '..', '..', '..', '..', 'ui', 'app', 'components', 'dropdowns', 'index.js')).Dropdown;
const DropdownMenuItem = require(path.join(__dirname, '..', '..', '..', '..', 'ui', 'app', 'components', 'dropdown.js')).DropdownMenuItem;
const { createMockStore } = require('redux-test-utils')
const shallowWithStore = require('../../../lib/shallow-with-store')
const mockState = {
metamask: {
}
}
describe('Dropdown components', function () { describe('Dropdown components', function () {
let onClickOutside; let onClickOutside;
let closeMenu; let closeMenu;
let onClick; let onClick;
let dropdownComponentProps; let dropdownComponentProps = {
const renderer = ReactTestUtils.createRenderer()
beforeEach(function () {
onClickOutside = sinon.spy();
closeMenu = sinon.spy();
onClick = sinon.spy();
dropdownComponentProps = {
isOpen: true, isOpen: true,
zIndex: 11, zIndex: 11,
onClickOutside, onClickOutside,
@ -31,10 +29,17 @@ describe('Dropdown components', function () {
}, },
innerStyle: {}, innerStyle: {},
} }
});
it('can render two items', function () { let dropdownComponent
const dropdownComponent = h( let store
let component
beforeEach(function () {
onClickOutside = sinon.spy();
closeMenu = sinon.spy();
onClick = sinon.spy();
store = createMockStore(mockState)
component = shallowWithStore(h(
Dropdown, Dropdown,
dropdownComponentProps, dropdownComponentProps,
[ [
@ -42,74 +47,35 @@ describe('Dropdown components', function () {
.drop-menu-item:hover { background:rgb(235, 235, 235); } .drop-menu-item:hover { background:rgb(235, 235, 235); }
.drop-menu-item i { margin: 11px; } .drop-menu-item i { margin: 11px; }
`), `),
h(DropdownMenuItem, { h('li', {
closeMenu, closeMenu,
onClick, onClick,
}, 'Item 1'), }, 'Item 1'),
h(DropdownMenuItem, { h('li', {
closeMenu, closeMenu,
onClick, onClick,
}, 'Item 2'), }, 'Item 2'),
] ]
) ), store)
dropdownComponent = component.dive()
})
const component = additions.renderIntoDocument(dropdownComponent); it('can render two items', function () {
renderer.render(dropdownComponent); const items = dropdownComponent.find('li');
const items = additions.find(component, 'li');
assert.equal(items.length, 2); assert.equal(items.length, 2);
}); });
it('closes when item clicked', function() { it('closes when item clicked', function() {
const dropdownComponent = h( const items = dropdownComponent.find('li');
Dropdown, const node = items.at(0);
dropdownComponentProps, node.simulate('click');
[ assert.equal(node.props().closeMenu, closeMenu);
h('style', `
.drop-menu-item:hover { background:rgb(235, 235, 235); }
.drop-menu-item i { margin: 11px; }
`),
h(DropdownMenuItem, {
closeMenu,
onClick,
}, 'Item 1'),
h(DropdownMenuItem, {
closeMenu,
onClick,
}, 'Item 2'),
]
)
const component = additions.renderIntoDocument(dropdownComponent);
renderer.render(dropdownComponent);
const items = additions.find(component, 'li');
const node = items[0];
ReactTestUtils.Simulate.click(node);
assert.equal(closeMenu.calledOnce, true);
}); });
it('invokes click handler when item clicked', function() { it('invokes click handler when item clicked', function() {
const dropdownComponent = h( const items = dropdownComponent.find('li');
Dropdown, const node = items.at(0);
dropdownComponentProps, node.simulate('click');
[
h('style', `
.drop-menu-item:hover { background:rgb(235, 235, 235); }
.drop-menu-item i { margin: 11px; }
`),
h(DropdownMenuItem, {
closeMenu,
onClick,
}, 'Item 1'),
h(DropdownMenuItem, {
closeMenu,
onClick,
}, 'Item 2'),
]
)
const component = additions.renderIntoDocument(dropdownComponent);
renderer.render(dropdownComponent);
const items = additions.find(component, 'li');
const node = items[0];
ReactTestUtils.Simulate.click(node);
assert.equal(onClick.calledOnce, true); assert.equal(onClick.calledOnce, true);
}); });
}); });

@ -224,6 +224,8 @@ var actions = {
TOGGLE_ACCOUNT_MENU: 'TOGGLE_ACCOUNT_MENU', TOGGLE_ACCOUNT_MENU: 'TOGGLE_ACCOUNT_MENU',
toggleAccountMenu, toggleAccountMenu,
useEtherscanProvider,
} }
module.exports = actions module.exports = actions
@ -428,7 +430,7 @@ function addNewAccount () {
forceUpdateMetamaskState(dispatch) forceUpdateMetamaskState(dispatch)
return resolve(newAccountAddress) return resolve(newAccountAddress)
}) })
}); })
} }
} }
@ -619,7 +621,7 @@ function updateSendErrors (error) {
function clearSend () { function clearSend () {
return { return {
type: actions.CLEAR_SEND type: actions.CLEAR_SEND,
} }
} }
@ -1005,7 +1007,7 @@ function addTokens (tokens) {
function updateTokens (newTokens) { function updateTokens (newTokens) {
return { return {
type: actions.UPDATE_TOKENS, type: actions.UPDATE_TOKENS,
newTokens newTokens,
} }
} }

@ -2,7 +2,6 @@ const inherits = require('util').inherits
const Component = require('react').Component const Component = require('react').Component
const connect = require('react-redux').connect const connect = require('react-redux').connect
const h = require('react-hyperscript') const h = require('react-hyperscript')
const { checkFeatureToggle } = require('../lib/feature-toggle-utils')
const actions = require('./actions') const actions = require('./actions')
// mascara // mascara
const MascaraFirstTime = require('../../mascara/src/app/first-time').default const MascaraFirstTime = require('../../mascara/src/app/first-time').default
@ -12,9 +11,7 @@ const InitializeMenuScreen = require('./first-time/init-menu')
const NewKeyChainScreen = require('./new-keychain') const NewKeyChainScreen = require('./new-keychain')
// accounts // accounts
const MainContainer = require('./main-container') const MainContainer = require('./main-container')
const SendTransactionScreen = require('./send')
const SendTransactionScreen2 = require('./components/send/send-v2-container') const SendTransactionScreen2 = require('./components/send/send-v2-container')
const SendTokenScreen = require('./components/send-token')
const ConfirmTxScreen = require('./conf-tx') const ConfirmTxScreen = require('./conf-tx')
// notice // notice
const NoticeScreen = require('./components/notice') const NoticeScreen = require('./components/notice')
@ -27,7 +24,6 @@ const WalletView = require('./components/wallet-view')
const Settings = require('./settings') const Settings = require('./settings')
const AddTokenScreen = require('./add-token') const AddTokenScreen = require('./add-token')
const Import = require('./accounts/import') const Import = require('./accounts/import')
const InfoScreen = require('./info')
const Loading = require('./components/loading') const Loading = require('./components/loading')
const NetworkIndicator = require('./components/network') const NetworkIndicator = require('./components/network')
const Identicon = require('./components/identicon') const Identicon = require('./components/identicon')
@ -38,6 +34,7 @@ const RevealSeedConfirmation = require('./keychains/hd/recover-seed/confirmation
const ReactCSSTransitionGroup = require('react-addons-css-transition-group') const ReactCSSTransitionGroup = require('react-addons-css-transition-group')
const NetworkDropdown = require('./components/dropdowns/network-dropdown') const NetworkDropdown = require('./components/dropdowns/network-dropdown')
const AccountMenu = require('./components/account-menu') const AccountMenu = require('./components/account-menu')
const QrView = require('./components/qr-code')
// Global Modals // Global Modals
const Modal = require('./components/modals/index').Modal const Modal = require('./components/modals/index').Modal
@ -228,8 +225,6 @@ App.prototype.renderAppBar = function () {
} }
const props = this.props const props = this.props
const state = this.state || {}
const isNetworkMenuOpen = state.isNetworkMenuOpen || false
const {isMascara, isOnboarding} = props const {isMascara, isOnboarding} = props
// Do not render header if user is in mascara onboarding // Do not render header if user is in mascara onboarding

@ -2,7 +2,7 @@ const Component = require('react').Component
const h = require('react-hyperscript') const h = require('react-hyperscript')
const inherits = require('util').inherits const inherits = require('util').inherits
const InputNumber = require('../input-number.js') const InputNumber = require('../input-number.js')
const GasSlider = require('./gas-slider.js') // const GasSlider = require('./gas-slider.js')
module.exports = GasModalCard module.exports = GasModalCard
@ -13,8 +13,7 @@ function GasModalCard () {
GasModalCard.prototype.render = function () { GasModalCard.prototype.render = function () {
const { const {
memo, // memo,
identities,
onChange, onChange,
unitLabel, unitLabel,
value, value,
@ -22,7 +21,7 @@ GasModalCard.prototype.render = function () {
// max, // max,
step, step,
title, title,
copy copy,
} = this.props } = this.props
return h('div.send-v2__gas-modal-card', [ return h('div.send-v2__gas-modal-card', [

@ -1,50 +1,50 @@
const Component = require('react').Component // const Component = require('react').Component
const h = require('react-hyperscript') // const h = require('react-hyperscript')
const inherits = require('util').inherits // const inherits = require('util').inherits
module.exports = GasSlider // module.exports = GasSlider
inherits(GasSlider, Component) // inherits(GasSlider, Component)
function GasSlider () { // function GasSlider () {
Component.call(this) // Component.call(this)
} // }
GasSlider.prototype.render = function () { // GasSlider.prototype.render = function () {
const { // const {
memo, // memo,
identities, // identities,
onChange, // onChange,
unitLabel, // unitLabel,
value, // value,
id, // id,
step, // step,
max, // max,
min, // min,
} = this.props // } = this.props
return h('div.gas-slider', [ // return h('div.gas-slider', [
h('input.gas-slider__input', { // h('input.gas-slider__input', {
type: 'range', // type: 'range',
step, // step,
max, // max,
min, // min,
value, // value,
id: 'gasSlider', // id: 'gasSlider',
onChange: event => onChange(event.target.value), // onChange: event => onChange(event.target.value),
}, []), // }, []),
h('div.gas-slider__bar', [ // h('div.gas-slider__bar', [
h('div.gas-slider__low'), // h('div.gas-slider__low'),
h('div.gas-slider__mid'), // h('div.gas-slider__mid'),
h('div.gas-slider__high'), // h('div.gas-slider__high'),
]), // ]),
]) // ])
} // }

@ -2,7 +2,6 @@ const Component = require('react').Component
const h = require('react-hyperscript') const h = require('react-hyperscript')
const inherits = require('util').inherits const inherits = require('util').inherits
const connect = require('react-redux').connect const connect = require('react-redux').connect
const ethUtil = require('ethereumjs-util')
const actions = require('../../actions') const actions = require('../../actions')
const GasModalCard = require('./gas-modal-card') const GasModalCard = require('./gas-modal-card')
@ -91,7 +90,7 @@ CustomizeGasModal.prototype.save = function (gasPrice, gasLimit, gasTotal) {
updateGasPrice, updateGasPrice,
updateGasLimit, updateGasLimit,
hideModal, hideModal,
updateGasTotal updateGasTotal,
} = this.props } = this.props
updateGasPrice(gasPrice) updateGasPrice(gasPrice)
@ -191,7 +190,7 @@ CustomizeGasModal.prototype.convertAndSetGasPrice = function (newGasPrice) {
} }
CustomizeGasModal.prototype.render = function () { CustomizeGasModal.prototype.render = function () {
const { hideModal, conversionRate } = this.props const { hideModal } = this.props
const { gasPrice, gasLimit, gasTotal, error } = this.state const { gasPrice, gasLimit, gasTotal, error } = this.state
const convertedGasPrice = conversionUtil(gasPrice, { const convertedGasPrice = conversionUtil(gasPrice, {
@ -261,7 +260,7 @@ CustomizeGasModal.prototype.render = function () {
h(`div.send-v2__customize-gas__save${error ? '__error' : ''}`, { h(`div.send-v2__customize-gas__save${error ? '__error' : ''}`, {
onClick: () => !error && this.save(gasPrice, gasLimit, gasTotal), onClick: () => !error && this.save(gasPrice, gasLimit, gasTotal),
}, ['SAVE']), }, ['SAVE']),
]) ]),
]), ]),

@ -1,7 +1,6 @@
const Component = require('react').Component const Component = require('react').Component
const h = require('react-hyperscript') const h = require('react-hyperscript')
const inherits = require('util').inherits const inherits = require('util').inherits
const Identicon = require('../identicon')
const AccountListItem = require('../send/account-list-item') const AccountListItem = require('../send/account-list-item')
module.exports = AccountDropdownMini module.exports = AccountDropdownMini
@ -44,7 +43,7 @@ AccountDropdownMini.prototype.renderDropdown = function () {
closeDropdown() closeDropdown()
}, },
icon: this.getListItemIcon(account, selectedAccount), icon: this.getListItemIcon(account, selectedAccount),
})) })),
]), ]),
@ -53,10 +52,8 @@ AccountDropdownMini.prototype.renderDropdown = function () {
AccountDropdownMini.prototype.render = function () { AccountDropdownMini.prototype.render = function () {
const { const {
accounts,
selectedAccount, selectedAccount,
openDropdown, openDropdown,
closeDropdown,
dropdownOpen, dropdownOpen,
} = this.props } = this.props
@ -67,7 +64,7 @@ AccountDropdownMini.prototype.render = function () {
handleClick: openDropdown, handleClick: openDropdown,
displayBalance: false, displayBalance: false,
displayAddress: false, displayAddress: false,
icon: h(`i.fa.fa-caret-down.fa-lg`, { style: { color: '#dedede' } }) icon: h(`i.fa.fa-caret-down.fa-lg`, { style: { color: '#dedede' } }),
}), }),
dropdownOpen && this.renderDropdown(), dropdownOpen && this.renderDropdown(),

@ -19,7 +19,7 @@ AccountOptionsDropdown.prototype.render = function () {
return h(AccountDropdowns, { return h(AccountDropdowns, {
enableAccountOptions: true, enableAccountOptions: true,
enableAccountsSelector: false, enableAccountsSelector: false,
selected: selectedAddress, selected,
network, network,
identities, identities,
style: style || {}, style: style || {},

@ -19,7 +19,7 @@ AccountSelectionDropdown.prototype.render = function () {
return h(AccountDropdowns, { return h(AccountDropdowns, {
enableAccountOptions: false, enableAccountOptions: false,
enableAccountsSelector: true, enableAccountsSelector: true,
selected: selectedAddress, selected,
network, network,
identities, identities,
style: style || {}, style: style || {},

@ -425,6 +425,21 @@ AccountDropdowns.propTypes = {
identities: PropTypes.objectOf(PropTypes.object), identities: PropTypes.objectOf(PropTypes.object),
selected: PropTypes.string, selected: PropTypes.string,
keyrings: PropTypes.array, keyrings: PropTypes.array,
accounts: PropTypes.object,
menuItemStyles: PropTypes.object,
actions: PropTypes.object,
// actions.showAccountDetail: ,
useCssTransition: PropTypes.bool,
innerStyle: PropTypes.object,
sidebarOpen: PropTypes.bool,
dropdownWrapperStyle: PropTypes.string,
// actions.showAccountDetailModal: ,
network: PropTypes.number,
// actions.showExportPrivateKeyModal: ,
style: PropTypes.object,
enableAccountsSelector: PropTypes.bool,
enableAccountOption: PropTypes.bool,
enableAccountOptions: PropTypes.bool,
} }
const mapDispatchToProps = (dispatch) => { const mapDispatchToProps = (dispatch) => {

@ -68,6 +68,7 @@ Dropdown.propTypes = {
onClickOutside: PropTypes.func, onClickOutside: PropTypes.func,
innerStyle: PropTypes.object, innerStyle: PropTypes.object,
useCssTransition: PropTypes.bool, useCssTransition: PropTypes.bool,
containerClassName: PropTypes.string,
} }
class DropdownMenuItem extends Component { class DropdownMenuItem extends Component {

@ -1,4 +1,5 @@
const { Component, PropTypes } = require('react') const { Component } = require('react')
const PropTypes = require('react').PropTypes
const h = require('react-hyperscript') const h = require('react-hyperscript')
const classnames = require('classnames') const classnames = require('classnames')
const R = require('ramda') const R = require('ramda')

@ -10,7 +10,7 @@ function mapDispatchToProps (dispatch) {
return { return {
showHideTokenConfirmationModal: (token) => { showHideTokenConfirmationModal: (token) => {
dispatch(actions.showModal({ name: 'HIDE_TOKEN_CONFIRMATION', token })) dispatch(actions.showModal({ name: 'HIDE_TOKEN_CONFIRMATION', token }))
} },
} }
} }
@ -43,7 +43,7 @@ TokenMenuDropdown.prototype.render = function () {
showHideTokenConfirmationModal(this.props.token) showHideTokenConfirmationModal(this.props.token)
this.props.onClose() this.props.onClose()
}, },
}, 'Hide Token') }, 'Hide Token'),
]), ]),
]), ]),

@ -1,5 +1,6 @@
const { Component } = require('react') const { Component } = require('react')
const h = require('react-hyperscript') const h = require('react-hyperscript')
const PropTypes = require('react').PropTypes
class LoadingIndicator extends Component { class LoadingIndicator extends Component {
renderMessage () { renderMessage () {
@ -35,4 +36,8 @@ class LoadingIndicator extends Component {
} }
} }
LoadingIndicator.propTypes = {
loadingMessage: PropTypes.string,
}
module.exports = LoadingIndicator module.exports = LoadingIndicator

@ -4,7 +4,7 @@ const inherits = require('util').inherits
const connect = require('react-redux').connect const connect = require('react-redux').connect
const actions = require('../../actions') const actions = require('../../actions')
const AccountModalContainer = require('./account-modal-container') const AccountModalContainer = require('./account-modal-container')
const { getSelectedIdentity, getSelectedAddress } = require('../../selectors') const { getSelectedIdentity } = require('../../selectors')
const genAccountLink = require('../../../lib/account-link.js') const genAccountLink = require('../../../lib/account-link.js')
const QrView = require('../qr-code') const QrView = require('../qr-code')
const EditableLabel = require('../editable-label') const EditableLabel = require('../editable-label')

@ -92,7 +92,6 @@ ExportPrivateKeyModal.prototype.renderButtons = function (privateKey, password,
ExportPrivateKeyModal.prototype.render = function () { ExportPrivateKeyModal.prototype.render = function () {
const { const {
selectedIdentity, selectedIdentity,
network,
warning, warning,
showAccountDetailModal, showAccountDetailModal,
hideModal, hideModal,

@ -220,7 +220,7 @@ Modal.prototype.render = function () {
const children = modal.contents const children = modal.contents
const modalStyle = modal[isMobileView() ? 'mobileModalStyle' : 'laptopModalStyle'] const modalStyle = modal[isMobileView() ? 'mobileModalStyle' : 'laptopModalStyle']
const contentStyle = modal.contentStyle || {}; const contentStyle = modal.contentStyle || {}
return h(FadeModal, return h(FadeModal,
{ {

@ -35,6 +35,6 @@ ShapeshiftDepositTxModal.prototype.render = function () {
}, [ }, [
h('div', {}, [ h('div', {}, [
h(QrView, {key: 'qr', Qr}), h(QrView, {key: 'qr', Qr}),
]) ]),
]) ])
} }

@ -1,6 +1,6 @@
const Component = require('react').Component const Component = require('react').Component
const h = require('react-hyperscript') const h = require('react-hyperscript')
const classnames = require('classnames'); const classnames = require('classnames')
const inherits = require('util').inherits const inherits = require('util').inherits
const NetworkDropdownIcon = require('./dropdowns/components/network-dropdown-icon') const NetworkDropdownIcon = require('./dropdowns/components/network-dropdown-icon')

@ -10,7 +10,6 @@ const clone = require('clone')
const Identicon = require('../identicon') const Identicon = require('../identicon')
const ethUtil = require('ethereumjs-util') const ethUtil = require('ethereumjs-util')
const BN = ethUtil.BN const BN = ethUtil.BN
const hexToBn = require('../../../../app/scripts/lib/hex-to-bn')
const { const {
conversionUtil, conversionUtil,
multiplyCurrencies, multiplyCurrencies,
@ -20,7 +19,6 @@ const {
const { MIN_GAS_PRICE_HEX } = require('../send/send-constants') const { MIN_GAS_PRICE_HEX } = require('../send/send-constants')
const { const {
getSelectedTokenExchangeRate,
getTokenExchangeRate, getTokenExchangeRate,
getSelectedAddress, getSelectedAddress,
} = require('../../selectors') } = require('../../selectors')
@ -36,7 +34,6 @@ function mapStateToProps (state, ownProps) {
identities, identities,
currentCurrency, currentCurrency,
} = state.metamask } = state.metamask
const accounts = state.metamask.accounts
const selectedAddress = getSelectedAddress(state) const selectedAddress = getSelectedAddress(state)
const tokenExchangeRate = getTokenExchangeRate(state, symbol) const tokenExchangeRate = getTokenExchangeRate(state, symbol)
@ -245,7 +242,6 @@ ConfirmSendToken.prototype.renderTotalPlusGas = function () {
ConfirmSendToken.prototype.render = function () { ConfirmSendToken.prototype.render = function () {
const { backToAccountDetail, selectedAddress } = this.props const { backToAccountDetail, selectedAddress } = this.props
const txMeta = this.gatherTxMeta() const txMeta = this.gatherTxMeta()
const txParams = txMeta.txParams || {}
const { const {
from: { from: {

@ -144,16 +144,15 @@ SendTokenScreen.prototype.validate = function () {
} }
SendTokenScreen.prototype.setErrorsFor = function (field) { SendTokenScreen.prototype.setErrorsFor = function (field) {
const { balance, selectedToken } = this.props
const { errors: previousErrors } = this.state const { errors: previousErrors } = this.state
const { const {
isValid, isValid,
errors: newErrors errors: newErrors,
} = this.validate() } = this.validate()
const nextErrors = Object.assign({}, previousErrors, { const nextErrors = Object.assign({}, previousErrors, {
[field]: newErrors[field] || null [field]: newErrors[field] || null,
}) })
if (!isValid) { if (!isValid) {
@ -167,7 +166,7 @@ SendTokenScreen.prototype.setErrorsFor = function (field) {
SendTokenScreen.prototype.clearErrorsFor = function (field) { SendTokenScreen.prototype.clearErrorsFor = function (field) {
const { errors: previousErrors } = this.state const { errors: previousErrors } = this.state
const nextErrors = Object.assign({}, previousErrors, { const nextErrors = Object.assign({}, previousErrors, {
[field]: null [field]: null,
}) })
this.setState({ this.setState({

@ -1,7 +1,6 @@
const Component = require('react').Component const Component = require('react').Component
const h = require('react-hyperscript') const h = require('react-hyperscript')
const inherits = require('util').inherits const inherits = require('util').inherits
const Identicon = require('../identicon')
const { conversionUtil, multiplyCurrencies } = require('../../conversion-util') const { conversionUtil, multiplyCurrencies } = require('../../conversion-util')
module.exports = CurrencyDisplay module.exports = CurrencyDisplay
@ -48,8 +47,6 @@ CurrencyDisplay.prototype.render = function () {
conversionRate, conversionRate,
primaryCurrency, primaryCurrency,
convertedCurrency, convertedCurrency,
convertedPrefix = '',
placeholder = '0',
readOnly = false, readOnly = false,
inError = false, inError = false,
value: initValue, value: initValue,
@ -74,7 +71,7 @@ CurrencyDisplay.prototype.render = function () {
conversionRate, conversionRate,
}) })
const inputSizeMultiplier = readOnly ? 1 : 1.2; const inputSizeMultiplier = readOnly ? 1 : 1.2
return h('div', { return h('div', {
className, className,
@ -98,15 +95,13 @@ CurrencyDisplay.prototype.render = function () {
if (newValue === '') { if (newValue === '') {
newValue = '0' newValue = '0'
} } else if (newValue.match(/^0[1-9]$/)) {
else if (newValue.match(/^0[1-9]$/)) {
newValue = newValue.match(/[1-9]/)[0] newValue = newValue.match(/[1-9]/)[0]
} }
if (newValue && !isValidInput(newValue)) { if (newValue && !isValidInput(newValue)) {
event.preventDefault() event.preventDefault()
} } else {
else {
validate(this.getAmount(newValue)) validate(this.getAmount(newValue))
this.setState({ value: newValue }) this.setState({ value: newValue })
} }

@ -30,8 +30,8 @@ EthFeeDisplay.prototype.render = function () {
color: '#5d5d5d', color: '#5d5d5d',
fontSize: '16px', fontSize: '16px',
fontFamily: 'DIN OT', fontFamily: 'DIN OT',
lineHeight: '22.4px' lineHeight: '22.4px',
} },
}) })
} }

@ -1,7 +1,6 @@
const Component = require('react').Component const Component = require('react').Component
const h = require('react-hyperscript') const h = require('react-hyperscript')
const inherits = require('util').inherits const inherits = require('util').inherits
const Identicon = require('../identicon')
const AccountListItem = require('./account-list-item') const AccountListItem = require('./account-list-item')
module.exports = FromDropdown module.exports = FromDropdown
@ -42,7 +41,7 @@ FromDropdown.prototype.renderDropdown = function () {
closeDropdown() closeDropdown()
}, },
icon: this.getListItemIcon(account, selectedAccount), icon: this.getListItemIcon(account, selectedAccount),
})) })),
]), ]),
@ -51,10 +50,8 @@ FromDropdown.prototype.renderDropdown = function () {
FromDropdown.prototype.render = function () { FromDropdown.prototype.render = function () {
const { const {
accounts,
selectedAccount, selectedAccount,
openDropdown, openDropdown,
closeDropdown,
dropdownOpen, dropdownOpen,
} = this.props } = this.props
@ -63,7 +60,7 @@ FromDropdown.prototype.render = function () {
h(AccountListItem, { h(AccountListItem, {
account: selectedAccount, account: selectedAccount,
handleClick: openDropdown, handleClick: openDropdown,
icon: h(`i.fa.fa-caret-down.fa-lg`, { style: { color: '#dedede' } }) icon: h(`i.fa.fa-caret-down.fa-lg`, { style: { color: '#dedede' } }),
}), }),
dropdownOpen && this.renderDropdown(), dropdownOpen && this.renderDropdown(),

@ -23,21 +23,20 @@ GasFeeDisplay.prototype.render = function () {
gasTotal gasTotal
? h(CurrencyDisplay, { ? h(CurrencyDisplay, {
primaryCurrency: 'ETH', primaryCurrency,
convertedCurrency, convertedCurrency,
value: gasTotal, value: gasTotal,
conversionRate, conversionRate,
convertedPrefix: '$', convertedPrefix: '$',
readOnly: true, readOnly: true,
}) })
: h('div.currency-display', 'Loading...') : h('div.currency-display', 'Loading...'),
,
h('div.send-v2__sliders-icon-container', { h('div.send-v2__sliders-icon-container', {
onClick, onClick,
}, [ }, [
h('i.fa.fa-sliders.send-v2__sliders-icon'), h('i.fa.fa-sliders.send-v2__sliders-icon'),
]) ]),
]) ])
} }

@ -1,33 +1,33 @@
const Component = require('react').Component // const Component = require('react').Component
const h = require('react-hyperscript') // const h = require('react-hyperscript')
const inherits = require('util').inherits // const inherits = require('util').inherits
const Identicon = require('../identicon') // const Identicon = require('../identicon')
module.exports = MemoTextArea // module.exports = MemoTextArea
inherits(MemoTextArea, Component) // inherits(MemoTextArea, Component)
function MemoTextArea () { // function MemoTextArea () {
Component.call(this) // Component.call(this)
} // }
MemoTextArea.prototype.render = function () { // MemoTextArea.prototype.render = function () {
const { memo, identities, onChange } = this.props // const { memo, identities, onChange } = this.props
return h('div.send-v2__memo-text-area', [ // return h('div.send-v2__memo-text-area', [
h('textarea.send-v2__memo-text-area__input', { // h('textarea.send-v2__memo-text-area__input', {
placeholder: 'Optional', // placeholder: 'Optional',
value: memo, // value: memo,
onChange, // onChange,
// onBlur: () => { // // onBlur: () => {
// this.setErrorsFor('memo') // // this.setErrorsFor('memo')
// // },
// onFocus: event => {
// // this.clearErrorsFor('memo')
// }, // },
onFocus: event => { // }),
// this.clearErrorsFor('memo')
},
}),
]) // ])
} // }

@ -1,5 +1,4 @@
const ethUtil = require('ethereumjs-util') const ethUtil = require('ethereumjs-util')
const Identicon = require('../identicon')
const { conversionUtil, multiplyCurrencies } = require('../../conversion-util') const { conversionUtil, multiplyCurrencies } = require('../../conversion-util')
const MIN_GAS_PRICE_HEX = (100000000).toString(16) const MIN_GAS_PRICE_HEX = (100000000).toString(16)

@ -27,7 +27,6 @@ function isBalanceSufficient({
fromNumericBase: 'hex', fromNumericBase: 'hex',
conversionRate: amountConversionRate, conversionRate: amountConversionRate,
fromCurrency: selectedToken || primaryCurrency, fromCurrency: selectedToken || primaryCurrency,
conversionRate: amountConversionRate,
}, },
) )

@ -3,17 +3,12 @@ const actions = require('../../actions')
const abi = require('ethereumjs-abi') const abi = require('ethereumjs-abi')
const SendEther = require('../../send-v2') const SendEther = require('../../send-v2')
const { multiplyCurrencies } = require('../../conversion-util')
const { const {
accountsWithSendEtherInfoSelector, accountsWithSendEtherInfoSelector,
getCurrentAccountWithSendEtherInfo, getCurrentAccountWithSendEtherInfo,
conversionRateSelector, conversionRateSelector,
getSelectedToken, getSelectedToken,
getSelectedTokenExchangeRate,
getSelectedAddress, getSelectedAddress,
getGasPrice,
getGasLimit,
getAddressBook, getAddressBook,
getSendFrom, getSendFrom,
getCurrentCurrency, getCurrentCurrency,
@ -26,12 +21,11 @@ function mapStateToProps (state) {
const fromAccounts = accountsWithSendEtherInfoSelector(state) const fromAccounts = accountsWithSendEtherInfoSelector(state)
const selectedAddress = getSelectedAddress(state) const selectedAddress = getSelectedAddress(state)
const selectedToken = getSelectedToken(state) const selectedToken = getSelectedToken(state)
const tokenExchangeRates = state.metamask.tokenExchangeRates
const conversionRate = conversionRateSelector(state) const conversionRate = conversionRateSelector(state)
let data; let data
let primaryCurrency; let primaryCurrency
let tokenToFiatRate; let tokenToFiatRate
if (selectedToken) { if (selectedToken) {
data = Array.prototype.map.call( data = Array.prototype.map.call(
abi.rawEncode(['address', 'uint256'], [selectedAddress, '0x0']), abi.rawEncode(['address', 'uint256'], [selectedAddress, '0x0']),
@ -76,6 +70,6 @@ function mapDispatchToProps (dispatch) {
updateSendMemo: newMemo => dispatch(actions.updateSendMemo(newMemo)), updateSendMemo: newMemo => dispatch(actions.updateSendMemo(newMemo)),
updateSendErrors: newError => dispatch(actions.updateSendErrors(newError)), updateSendErrors: newError => dispatch(actions.updateSendErrors(newError)),
goHome: () => dispatch(actions.goHome()), goHome: () => dispatch(actions.goHome()),
clearSend: () => dispatch(actions.clearSend()) clearSend: () => dispatch(actions.clearSend()),
} }
} }

@ -1,7 +1,6 @@
const Component = require('react').Component const Component = require('react').Component
const h = require('react-hyperscript') const h = require('react-hyperscript')
const inherits = require('util').inherits const inherits = require('util').inherits
const Identicon = require('../identicon')
const AccountListItem = require('./account-list-item') const AccountListItem = require('./account-list-item')
module.exports = ToAutoComplete module.exports = ToAutoComplete
@ -23,7 +22,6 @@ ToAutoComplete.prototype.getListItemIcon = function (listItemAddress, toAddress)
ToAutoComplete.prototype.renderDropdown = function () { ToAutoComplete.prototype.renderDropdown = function () {
const { const {
accounts,
closeDropdown, closeDropdown,
onChange, onChange,
to, to,
@ -47,7 +45,7 @@ ToAutoComplete.prototype.renderDropdown = function () {
icon: this.getListItemIcon(account.address, to), icon: this.getListItemIcon(account.address, to),
displayBalance: false, displayBalance: false,
displayAddress: true, displayAddress: true,
})) })),
]), ]),
@ -69,8 +67,7 @@ ToAutoComplete.prototype.handleInputEvent = function (event = {}, cb) {
this.setState({ accountsToRender: [] }) this.setState({ accountsToRender: [] })
event.target && event.target.select() event.target && event.target.select()
closeDropdown() closeDropdown()
} } else {
else {
this.setState({ accountsToRender: matchingAccounts }) this.setState({ accountsToRender: matchingAccounts })
openDropdown() openDropdown()
} }
@ -86,9 +83,6 @@ ToAutoComplete.prototype.componentDidUpdate = function (nextProps, nextState) {
ToAutoComplete.prototype.render = function () { ToAutoComplete.prototype.render = function () {
const { const {
to, to,
accounts,
openDropdown,
closeDropdown,
dropdownOpen, dropdownOpen,
onChange, onChange,
inError, inError,
@ -104,7 +98,7 @@ ToAutoComplete.prototype.render = function () {
onFocus: event => this.handleInputEvent(event), onFocus: event => this.handleInputEvent(event),
style: { style: {
borderColor: inError ? 'red' : null, borderColor: inError ? 'red' : null,
} },
}), }),
!to && h(`i.fa.fa-caret-down.fa-lg.send-v2__to-autocomplete__down-caret`, { !to && h(`i.fa.fa-caret-down.fa-lg.send-v2__to-autocomplete__down-caret`, {

@ -28,8 +28,8 @@ USDFeeDisplay.prototype.render = function () {
color: '#5d5d5d', color: '#5d5d5d',
fontSize: '16px', fontSize: '16px',
fontFamily: 'DIN OT', fontFamily: 'DIN OT',
lineHeight: '22.4px' lineHeight: '22.4px',
} },
}) })
} }

@ -6,9 +6,7 @@ const connect = require('react-redux').connect
const ethUtil = require('ethereumjs-util') const ethUtil = require('ethereumjs-util')
const classnames = require('classnames') const classnames = require('classnames')
const PendingTxDetails = require('./pending-personal-msg-details')
const AccountDropdownMini = require('./dropdowns/account-dropdown-mini') const AccountDropdownMini = require('./dropdowns/account-dropdown-mini')
const BinaryRenderer = require('./binary-renderer')
const actions = require('../actions') const actions = require('../actions')
const { conversionUtil } = require('../conversion-util') const { conversionUtil } = require('../conversion-util')
@ -29,13 +27,13 @@ function mapStateToProps (state) {
requester: null, requester: null,
requesterAddress: null, requesterAddress: null,
accounts: accountsWithSendEtherInfoSelector(state), accounts: accountsWithSendEtherInfoSelector(state),
conversionRate: conversionRateSelector(state) conversionRate: conversionRateSelector(state),
} }
} }
function mapDispatchToProps (dispatch) { function mapDispatchToProps (dispatch) {
return { return {
goHome: () => dispatch(actions.goHome()) goHome: () => dispatch(actions.goHome()),
} }
} }
@ -86,7 +84,7 @@ SignatureRequest.prototype.renderAccountDropdown = function () {
dropdownOpen: accountDropdownOpen, dropdownOpen: accountDropdownOpen,
openDropdown: () => this.setState({ accountDropdownOpen: true }), openDropdown: () => this.setState({ accountDropdownOpen: true }),
closeDropdown: () => this.setState({ accountDropdownOpen: false }), closeDropdown: () => this.setState({ accountDropdownOpen: false }),
}) }),
]) ])
} }
@ -130,18 +128,16 @@ SignatureRequest.prototype.renderRequestIcon = function () {
h(Identicon, { h(Identicon, {
diameter: 40, diameter: 40,
address: requesterAddress, address: requesterAddress,
}) }),
]) ])
} }
SignatureRequest.prototype.renderRequestInfo = function () { SignatureRequest.prototype.renderRequestInfo = function () {
const { requester } = this.props
return h('div.request-signature__request-info', [ return h('div.request-signature__request-info', [
h('div.request-signature__headline', [ h('div.request-signature__headline', [
`Your signature is being requested`, `Your signature is being requested`,
]) ]),
]) ])
} }
@ -165,11 +161,9 @@ SignatureRequest.prototype.renderBody = function () {
if (type === 'personal_sign') { if (type === 'personal_sign') {
rows = [{ name: 'Message', value: this.msgHexToText(data) }] rows = [{ name: 'Message', value: this.msgHexToText(data) }]
} } else if (type === 'eth_signTypedData') {
else if (type === 'eth_signTypedData') {
rows = data rows = data
} } else if (type === 'eth_sign') {
else if (type === 'eth_sign') {
rows = [{ name: 'Message', value: data }] rows = [{ name: 'Message', value: data }]
notice = `Signing this message can have notice = `Signing this message can have
dangerous side effects. Only sign messages from dangerous side effects. Only sign messages from
@ -187,7 +181,7 @@ SignatureRequest.prototype.renderBody = function () {
className: classnames({ className: classnames({
'request-signature__notice': type === 'personal_sign' || type === 'eth_signTypedData', 'request-signature__notice': type === 'personal_sign' || type === 'eth_signTypedData',
'request-signature__warning': type === 'eth_sign', 'request-signature__warning': type === 'eth_sign',
}) }),
}, [notice]), }, [notice]),
h('div.request-signature__rows', [ h('div.request-signature__rows', [
@ -206,7 +200,6 @@ SignatureRequest.prototype.renderBody = function () {
SignatureRequest.prototype.renderFooter = function () { SignatureRequest.prototype.renderFooter = function () {
const { const {
goHome,
signPersonalMessage, signPersonalMessage,
signTypedMessage, signTypedMessage,
cancelPersonalMessage, cancelPersonalMessage,
@ -223,12 +216,10 @@ SignatureRequest.prototype.renderFooter = function () {
if (type === 'personal_sign') { if (type === 'personal_sign') {
cancel = cancelPersonalMessage cancel = cancelPersonalMessage
sign = signPersonalMessage sign = signPersonalMessage
} } else if (type === 'eth_signTypedData') {
else if (type === 'eth_signTypedData') {
cancel = cancelTypedMessage cancel = cancelTypedMessage
sign = signTypedMessage sign = signTypedMessage
} } else if (type === 'eth_sign') {
else if (type === 'eth_sign') {
cancel = cancelMessage cancel = cancelMessage
sign = signMessage sign = signMessage
} }

@ -1,5 +1,6 @@
const { Component } = require('react') const { Component } = require('react')
const h = require('react-hyperscript') const h = require('react-hyperscript')
const PropTypes = require('react').PropTypes
const classnames = require('classnames') const classnames = require('classnames')
class TabBar extends Component { class TabBar extends Component {
@ -37,4 +38,10 @@ class TabBar extends Component {
} }
} }
TabBar.propTypes = {
defaultTab: PropTypes.string,
tabs: PropTypes.array,
tabSelected: PropTypes.func,
}
module.exports = TabBar module.exports = TabBar

@ -68,10 +68,10 @@ TokenCell.prototype.render = function () {
// userAddress, // userAddress,
} = props } = props
const pair = `${symbol.toLowerCase()}_eth`; const pair = `${symbol.toLowerCase()}_eth`
let currentTokenToFiatRate; let currentTokenToFiatRate
let currentTokenInFiat; let currentTokenInFiat
let formattedFiat = '' let formattedFiat = ''
if (tokenExchangeRates[pair]) { if (tokenExchangeRates[pair]) {
@ -86,7 +86,7 @@ TokenCell.prototype.render = function () {
numberOfDecimals: 2, numberOfDecimals: 2,
conversionRate: currentTokenToFiatRate, conversionRate: currentTokenToFiatRate,
}) })
formattedFiat = `${currentTokenInFiat} ${currentCurrency.toUpperCase()}`; formattedFiat = `${currentTokenInFiat} ${currentCurrency.toUpperCase()}`
} }
const showFiat = Boolean(currentTokenInFiat) && currentCurrency.toUpperCase() !== symbol const showFiat = Boolean(currentTokenInFiat) && currentCurrency.toUpperCase() !== symbol

@ -3,7 +3,6 @@ const h = require('react-hyperscript')
const inherits = require('util').inherits const inherits = require('util').inherits
const TokenTracker = require('eth-token-tracker') const TokenTracker = require('eth-token-tracker')
const TokenCell = require('./token-cell.js') const TokenCell = require('./token-cell.js')
const normalizeAddress = require('eth-sig-util').normalize
const connect = require('react-redux').connect const connect = require('react-redux').connect
const selectors = require('../selectors') const selectors = require('../selectors')
@ -38,6 +37,7 @@ function TokenList () {
} }
TokenList.prototype.render = function () { TokenList.prototype.render = function () {
const { userAddress } = this.props
const state = this.state const state = this.state
const { tokens, isLoading, error } = state const { tokens, isLoading, error } = state
@ -162,15 +162,15 @@ TokenList.prototype.componentWillUnmount = function () {
this.tracker.stop() this.tracker.stop()
} }
function uniqueMergeTokens (tokensA, tokensB = []) { // function uniqueMergeTokens (tokensA, tokensB = []) {
const uniqueAddresses = [] // const uniqueAddresses = []
const result = [] // const result = []
tokensA.concat(tokensB).forEach((token) => { // tokensA.concat(tokensB).forEach((token) => {
const normal = normalizeAddress(token.address) // const normal = normalizeAddress(token.address)
if (!uniqueAddresses.includes(normal)) { // if (!uniqueAddresses.includes(normal)) {
uniqueAddresses.push(normal) // uniqueAddresses.push(normal)
result.push(token) // result.push(token)
} // }
}) // })
return result // return result
} // }

@ -142,7 +142,7 @@ function formatDate (date) {
} }
function renderErrorOrWarning (transaction) { function renderErrorOrWarning (transaction) {
const { status, err, warning } = transaction const { status } = transaction
// show rejected // show rejected
if (status === 'rejected') { if (status === 'rejected') {
@ -151,7 +151,6 @@ function renderErrorOrWarning (transaction) {
if (transaction.err || transaction.warning) { if (transaction.err || transaction.warning) {
const { err, warning = {} } = transaction const { err, warning = {} } = transaction
const errFirst = !!((err && warning) || err) const errFirst = !!((err && warning) || err)
const message = errFirst ? err.message : warning.message
errFirst ? err.message : warning.message errFirst ? err.message : warning.message
@ -179,3 +178,4 @@ function renderErrorOrWarning (transaction) {
]) ])
} }
} }
}

@ -6,7 +6,6 @@ const classnames = require('classnames')
const abi = require('human-standard-token-abi') const abi = require('human-standard-token-abi')
const abiDecoder = require('abi-decoder') const abiDecoder = require('abi-decoder')
abiDecoder.addABI(abi) abiDecoder.addABI(abi)
const prefixForNetwork = require('../../lib/etherscan-prefix-for-network')
const Identicon = require('./identicon') const Identicon = require('./identicon')
const contractMap = require('eth-contract-metadata') const contractMap = require('eth-contract-metadata')
@ -127,7 +126,6 @@ TxListItem.prototype.getTokenInfo = async function () {
TxListItem.prototype.getSendTokenTotal = async function () { TxListItem.prototype.getSendTokenTotal = async function () {
const { const {
txParams = {}, txParams = {},
tokens,
conversionRate, conversionRate,
tokenExchangeRates, tokenExchangeRates,
currentCurrency, currentCurrency,
@ -140,7 +138,7 @@ TxListItem.prototype.getSendTokenTotal = async function () {
const multiplier = Math.pow(10, Number(decimals || 0)) const multiplier = Math.pow(10, Number(decimals || 0))
const total = Number(value / multiplier) const total = Number(value / multiplier)
const pair = symbol && `${symbol.toLowerCase()}_eth`; const pair = symbol && `${symbol.toLowerCase()}_eth`
let tokenToFiatRate let tokenToFiatRate
let totalInFiat let totalInFiat
@ -244,6 +242,6 @@ TxListItem.prototype.render = function () {
]), ]),
]), ]),
]) // holding on icon from design ]), // holding on icon from design
]) ])
} }

@ -6,7 +6,7 @@ const prefixForNetwork = require('../../lib/etherscan-prefix-for-network')
const selectors = require('../selectors') const selectors = require('../selectors')
const TxListItem = require('./tx-list-item') const TxListItem = require('./tx-list-item')
const ShiftListItem = require('./shift-list-item') const ShiftListItem = require('./shift-list-item')
const { formatBalance, formatDate } = require('../util') const { formatDate } = require('../util')
const { showConfTxPage } = require('../actions') const { showConfTxPage } = require('../actions')
const classnames = require('classnames') const classnames = require('classnames')
const { tokenInfoGetter } = require('../token-util') const { tokenInfoGetter } = require('../token-util')
@ -22,7 +22,7 @@ function mapStateToProps (state) {
function mapDispatchToProps (dispatch) { function mapDispatchToProps (dispatch) {
return { return {
showConfTxPage: ({ id }) => dispatch(showConfTxPage({ id })) showConfTxPage: ({ id }) => dispatch(showConfTxPage({ id })),
} }
} }
@ -36,9 +36,6 @@ TxList.prototype.componentWillMount = function () {
} }
TxList.prototype.render = function () { TxList.prototype.render = function () {
const { txsToRender, showConfTxPage } = this.props
return h('div.flex-column.tx-list-container', {}, [ return h('div.flex-column.tx-list-container', {}, [
h('div.flex-row.tx-list-header-wrapper', [ h('div.flex-row.tx-list-header-wrapper', [
@ -98,7 +95,6 @@ TxList.prototype.renderTransactionListItem = function (transaction, conversionRa
txParams: transaction.txParams, txParams: transaction.txParams,
transactionStatus, transactionStatus,
transActionId, transActionId,
key: transActionId,
dateString, dateString,
address, address,
transactionAmount, transactionAmount,
@ -107,7 +103,7 @@ TxList.prototype.renderTransactionListItem = function (transaction, conversionRa
tokenInfoGetter: this.tokenInfoGetter, tokenInfoGetter: this.tokenInfoGetter,
} }
const isUnapproved = transactionStatus === 'unapproved'; const isUnapproved = transactionStatus === 'unapproved'
if (isUnapproved) { if (isUnapproved) {
opts.onClick = () => showConfTxPage({id: transActionId}) opts.onClick = () => showConfTxPage({id: transActionId})

@ -114,7 +114,7 @@ ConfirmTxScreen.prototype.render = function () {
function currentTxView (opts) { function currentTxView (opts) {
log.info('rendering current tx view') log.info('rendering current tx view')
const { txData } = opts const { txData } = opts
const { txParams, msgParams, type } = txData const { txParams, msgParams } = txData
if (txParams) { if (txParams) {
log.debug('txParams detected, rendering pending tx') log.debug('txParams detected, rendering pending tx')

@ -22,6 +22,8 @@
*/ */
const BigNumber = require('bignumber.js') const BigNumber = require('bignumber.js')
const ethUtil = require('ethereumjs-util')
const BN = ethUtil.BN
const R = require('ramda') const R = require('ramda')
const { stripHexPrefix } = require('ethereumjs-util') const { stripHexPrefix } = require('ethereumjs-util')
@ -104,7 +106,7 @@ const converter = R.pipe(
whenPredSetWithPropAndSetter(R.prop('numberOfDecimals'), 'numberOfDecimals', round), whenPredSetWithPropAndSetter(R.prop('numberOfDecimals'), 'numberOfDecimals', round),
whenPropApplySetterMap('toNumericBase', baseChange), whenPropApplySetterMap('toNumericBase', baseChange),
R.view(R.lensProp('value')) R.view(R.lensProp('value'))
); )
const conversionUtil = (value, { const conversionUtil = (value, {
fromCurrency = null, fromCurrency = null,
@ -127,15 +129,15 @@ const conversionUtil = (value, {
conversionRate, conversionRate,
invertConversionRate, invertConversionRate,
value: value || '0', value: value || '0',
}); })
const addCurrencies = (a, b, options = {}) => { const addCurrencies = (a, b, options = {}) => {
const { const {
aBase, aBase,
bBase, bBase,
...conversionOptions, ...conversionOptions
} = options } = options
const value = (new BigNumber(a, aBase)).add(b, bBase); const value = (new BigNumber(a, aBase)).add(b, bBase)
return converter({ return converter({
value, value,
@ -147,13 +149,13 @@ const multiplyCurrencies = (a, b, options = {}) => {
const { const {
multiplicandBase, multiplicandBase,
multiplierBase, multiplierBase,
...conversionOptions, ...conversionOptions
} = options } = options
const bigNumberA = new BigNumber(String(a), multiplicandBase) const bigNumberA = new BigNumber(String(a), multiplicandBase)
const bigNumberB = new BigNumber(String(b), multiplierBase) const bigNumberB = new BigNumber(String(b), multiplierBase)
const value = bigNumberA.times(bigNumberB); const value = bigNumberA.times(bigNumberB)
return converter({ return converter({
value, value,

@ -44,7 +44,7 @@ function reduceApp (state, action) {
}, },
previousModalState: { previousModalState: {
name: null, name: null,
} },
}, },
sidebarOpen: false, sidebarOpen: false,
networkDropdownOpen: false, networkDropdownOpen: false,

@ -235,7 +235,7 @@ function reduceMetamask (state, action) {
errors: { errors: {
...metamaskState.send.errors, ...metamaskState.send.errors,
...action.value, ...action.value,
} },
}, },
}) })

@ -1,8 +1,6 @@
const { inherits } = require('util') const { inherits } = require('util')
const PersistentForm = require('../lib/persistent-form') const PersistentForm = require('../lib/persistent-form')
const h = require('react-hyperscript') const h = require('react-hyperscript')
const connect = require('react-redux').connect
const classnames = require('classnames')
const Identicon = require('./components/identicon') const Identicon = require('./components/identicon')
const FromDropdown = require('./components/send/from-dropdown') const FromDropdown = require('./components/send/from-dropdown')
@ -13,12 +11,9 @@ const GasFeeDisplay = require('./components/send/gas-fee-display-v2')
const { MIN_GAS_TOTAL } = require('./components/send/send-constants') const { MIN_GAS_TOTAL } = require('./components/send/send-constants')
const { showModal } = require('./actions')
const { const {
multiplyCurrencies, multiplyCurrencies,
conversionGreaterThan, conversionGreaterThan,
addCurrencies,
} = require('./conversion-util') } = require('./conversion-util')
const { const {
isBalanceSufficient, isBalanceSufficient,
@ -99,7 +94,7 @@ SendTransactionScreen.prototype.renderHeaderIcon = function () {
diameter: 40, diameter: 40,
address: selectedToken.address, address: selectedToken.address,
}) })
: h('img.send-v2__send-header-icon', { src: '../images/eth_logo.svg' }) : h('img.send-v2__send-header-icon', { src: '../images/eth_logo.svg' }),
]) ])
} }
@ -142,7 +137,7 @@ SendTransactionScreen.prototype.renderHeader = function () {
SendTransactionScreen.prototype.renderErrorMessage = function (errorType) { SendTransactionScreen.prototype.renderErrorMessage = function (errorType) {
const { errors } = this.props const { errors } = this.props
const errorMessage = errors[errorType]; const errorMessage = errors[errorType]
return errorMessage return errorMessage
? h('div.send-v2__error', [ errorMessage ]) ? h('div.send-v2__error', [ errorMessage ])
@ -154,7 +149,6 @@ SendTransactionScreen.prototype.renderFromRow = function () {
from, from,
fromAccounts, fromAccounts,
conversionRate, conversionRate,
setSelectedAddress,
updateSendFrom, updateSendFrom,
} = this.props } = this.props
@ -243,7 +237,6 @@ SendTransactionScreen.prototype.validateAmount = function (value) {
amountConversionRate, amountConversionRate,
conversionRate, conversionRate,
primaryCurrency, primaryCurrency,
toCurrency,
selectedToken, selectedToken,
gasTotal, gasTotal,
} = this.props } = this.props
@ -440,7 +433,6 @@ SendTransactionScreen.prototype.onSubmit = function (event) {
signTokenTx, signTokenTx,
signTx, signTx,
selectedToken, selectedToken,
toAccounts,
clearSend, clearSend,
errors: { amount: amountError, to: toError }, errors: { amount: amountError, to: toError },
} = this.props } = this.props

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save