aboutsummaryrefslogtreecommitdiffstats
path: root/ui/app/send.js
diff options
context:
space:
mode:
Diffstat (limited to 'ui/app/send.js')
-rw-r--r--ui/app/send.js1094
1 files changed, 547 insertions, 547 deletions
diff --git a/ui/app/send.js b/ui/app/send.js
index 5643d927b..517b7690d 100644
--- a/ui/app/send.js
+++ b/ui/app/send.js
@@ -1,547 +1,547 @@
-const { inherits } = require('util')
-const PersistentForm = require('../lib/persistent-form')
-const h = require('react-hyperscript')
-const connect = require('react-redux').connect
-const Identicon = require('./components/identicon')
-const EnsInput = require('./components/ens-input')
-const GasTooltip = require('./components/send/gas-tooltip')
-const CurrencyToggle = require('./components/send/currency-toggle')
-const GasFeeDisplay = require('./components/send/gas-fee-display')
-const { getSelectedIdentity } = require('./selectors')
-
-const {
- showAccountsPage,
- backToAccountDetail,
- displayWarning,
- hideWarning,
- addToAddressBook,
- signTx,
- estimateGas,
- getGasPrice,
-} = require('./actions')
-const { stripHexPrefix, addHexPrefix } = require('ethereumjs-util')
-const { isHex, numericBalance, isValidAddress, allNull } = require('./util')
-const { conversionUtil, conversionGreaterThan } = require('./conversion-util')
-
-module.exports = connect(mapStateToProps)(SendTransactionScreen)
-
-function mapStateToProps (state) {
- const {
- selectedAddress: address,
- accounts,
- identities,
- network,
- addressBook,
- conversionRate,
- currentBlockGasLimit: blockGasLimit,
- } = state.metamask
- const { warning } = state.appState
- const selectedIdentity = getSelectedIdentity(state)
- const account = accounts[address]
-
- return {
- address,
- accounts,
- identities,
- network,
- addressBook,
- conversionRate,
- blockGasLimit,
- warning,
- selectedIdentity,
- error: warning && warning.split('.')[0],
- account,
- identity: identities[address],
- balance: account ? account.balance : null,
- }
-}
-
-inherits(SendTransactionScreen, PersistentForm)
-function SendTransactionScreen () {
- PersistentForm.call(this)
-
- // [WIP] These are the bare minimum of tx props needed to sign a transaction
- // We will need a few more for contract-related interactions
- this.state = {
- newTx: {
- from: '',
- to: '',
- amountToSend: '0x0',
- gasPrice: null,
- gas: null,
- amount: '0x0',
- txData: null,
- memo: '',
- },
- activeCurrency: 'USD',
- tooltipIsOpen: false,
- errors: {},
- isValid: false,
- }
-
- this.back = this.back.bind(this)
- this.closeTooltip = this.closeTooltip.bind(this)
- this.onSubmit = this.onSubmit.bind(this)
- this.setActiveCurrency = this.setActiveCurrency.bind(this)
- this.toggleTooltip = this.toggleTooltip.bind(this)
- this.validate = this.validate.bind(this)
- this.getAmountToSend = this.getAmountToSend.bind(this)
- this.setErrorsFor = this.setErrorsFor.bind(this)
- this.clearErrorsFor = this.clearErrorsFor.bind(this)
-
- this.renderFromInput = this.renderFromInput.bind(this)
- this.renderToInput = this.renderToInput.bind(this)
- this.renderAmountInput = this.renderAmountInput.bind(this)
- this.renderGasInput = this.renderGasInput.bind(this)
- this.renderMemoInput = this.renderMemoInput.bind(this)
- this.renderErrorMessage = this.renderErrorMessage.bind(this)
-}
-
-SendTransactionScreen.prototype.componentWillMount = function () {
- const { newTx } = this.state
- const { address } = this.props
-
- Promise.all([
- this.props.dispatch(getGasPrice()),
- this.props.dispatch(estimateGas({
- from: address,
- gas: '746a528800',
- })),
- ])
- .then(([blockGasPrice, estimatedGas]) => {
- console.log({ blockGasPrice, estimatedGas})
- this.setState({
- newTx: {
- ...newTx,
- gasPrice: blockGasPrice,
- gas: estimatedGas,
- },
- })
- })
-}
-
-SendTransactionScreen.prototype.renderErrorMessage = function(errorType, warning) {
- const { errors } = this.state
- const errorMessage = errors[errorType];
-
- return errorMessage || warning
- ? h('div.send-screen-input-wrapper__error-message', [ errorMessage || warning ])
- : null
-}
-
-SendTransactionScreen.prototype.renderFromInput = function (from, identities) {
- return h('div.send-screen-input-wrapper', [
-
- h('div', 'From:'),
-
- h('input.large-input.send-screen-input', {
- list: 'accounts',
- placeholder: 'Account',
- value: from,
- onChange: (event) => {
- this.setState({
- newTx: {
- ...this.state.newTx,
- from: event.target.value,
- },
- })
- },
- onBlur: () => this.setErrorsFor('from'),
- onFocus: event => {
- this.clearErrorsFor('from')
- this.state.newTx.from && event.target.select()
- },
- }),
-
- h('datalist#accounts', [
- Object.entries(identities).map(([key, { address, name }]) => {
- return h('option', {
- value: address,
- label: name,
- key: address,
- })
- }),
- ]),
-
- this.renderErrorMessage('from'),
-
- ])
-}
-
-SendTransactionScreen.prototype.renderToInput = function (to, identities, addressBook) {
- return h('div.send-screen-input-wrapper', [
-
- h('div', 'To:'),
-
- h('input.large-input.send-screen-input', {
- name: 'address',
- list: 'addresses',
- placeholder: 'Address',
- value: to,
- onChange: (event) => {
- this.setState({
- newTx: {
- ...this.state.newTx,
- to: event.target.value,
- },
- })
- },
- onBlur: () => {
- this.setErrorsFor('to')
- },
- onFocus: event => {
- this.clearErrorsFor('to')
- this.state.newTx.to && event.target.select()
- },
- }),
-
- h('datalist#addresses', [
- // Corresponds to the addresses owned.
- ...Object.entries(identities).map(([key, { address, name }]) => {
- return h('option', {
- value: address,
- label: name,
- key: address,
- })
- }),
- // Corresponds to previously sent-to addresses.
- ...addressBook.map(({ address, name }) => {
- return h('option', {
- value: address,
- label: name,
- key: address,
- })
- }),
- ]),
-
- this.renderErrorMessage('to'),
-
- ])
-}
-
-SendTransactionScreen.prototype.renderAmountInput = function (activeCurrency) {
- return h('div.send-screen-input-wrapper', [
-
- h('div.send-screen-amount-labels', [
- h('span', 'Amount'),
- h(CurrencyToggle, {
- activeCurrency,
- onClick: (newCurrency) => this.setActiveCurrency(newCurrency),
- }), // holding on icon from design
- ]),
-
- h('input.large-input.send-screen-input', {
- placeholder: `0 ${activeCurrency}`,
- type: 'number',
- onChange: (event) => {
- const amountToSend = event.target.value
- ? this.getAmountToSend(event.target.value)
- : '0x0'
-
- this.setState({
- newTx: Object.assign(
- this.state.newTx,
- {
- amount: event.target.value,
- amountToSend: amountToSend,
- }
- ),
- })
- },
- onBlur: () => {
- this.setErrorsFor('amount')
- },
- onFocus: () => this.clearErrorsFor('amount'),
- }),
-
- this.renderErrorMessage('amount'),
-
- ])
-}
-
-SendTransactionScreen.prototype.renderGasInput = function (gasPrice, gas, activeCurrency, conversionRate, blockGasLimit) {
- return h('div.send-screen-input-wrapper', [
- this.state.tooltipIsOpen && h(GasTooltip, {
- className: 'send-tooltip',
- gasPrice,
- gasLimit: gas,
- onClose: this.closeTooltip,
- onFeeChange: ({gasLimit, gasPrice}) => {
- this.setState({
- newTx: {
- ...this.state.newTx,
- gas: gasLimit,
- gasPrice,
- },
- })
- },
- }),
-
- h('div.send-screen-gas-labels', [
- h('span', [
- h('i.fa.fa-bolt'),
- 'Gas fee:',
- ]),
- h('span', 'What\'s this?'),
- ]),
-
- // TODO: handle loading time when switching to USD
- h('div.large-input.send-screen-gas-input', {}, [
- h(GasFeeDisplay, {
- activeCurrency,
- conversionRate,
- gas,
- gasPrice,
- blockGasLimit,
- }),
- h('div.send-screen-gas-input-customize', {
- onClick: this.toggleTooltip,
- }, [
- 'Customize',
- ]),
- ]),
-
- ])
-}
-
-SendTransactionScreen.prototype.renderMemoInput = function () {
- return h('div.send-screen-input-wrapper', [
- h('div', 'Transaction memo (optional)'),
- h('input.large-input.send-screen-input', {
- onChange: () => {
- this.setState({
- newTx: Object.assign(
- this.state.newTx,
- {
- memo: event.target.value,
- }
- ),
- })
- },
- }),
- ])
-}
-
-SendTransactionScreen.prototype.render = function () {
- this.persistentFormParentId = 'send-tx-form'
-
- const props = this.props
- const {
- warning,
- identities,
- addressBook,
- conversionRate,
- } = props
-
- const {
- blockGasLimit,
- newTx,
- activeCurrency,
- isValid,
- } = this.state
- const { gas, gasPrice } = newTx
-
- return (
-
- h('div.send-screen-wrapper', [
- // Main Send token Card
- h('div.send-screen-card', [
-
- h('img.send-eth-icon', { src: '../images/eth_logo.svg' }),
-
- h('div.send-screen__title', 'Send'),
-
- h('div.send-screen__subtitle', 'Send Ethereum to anyone with an Ethereum account'),
-
- this.renderFromInput(this.state.newTx.from, identities),
-
- this.renderToInput(this.state.newTx.to, identities, addressBook),
-
- this.renderAmountInput(activeCurrency),
-
- this.renderGasInput(
- gasPrice || '0x0',
- gas || '0x0',
- activeCurrency,
- conversionRate,
- blockGasLimit
- ),
-
- this.renderMemoInput(),
-
- this.renderErrorMessage(null, warning),
-
- ]),
-
- // Buttons underneath card
- h('section.flex-column.flex-center', [
- h('button.btn-secondary.send-screen__send-button', {
- className: !isValid && 'send-screen__send-button__disabled',
- onClick: (event) => isValid && this.onSubmit(event),
- }, 'Next'),
- h('button.btn-tertiary.send-screen__cancel-button', {
- onClick: this.back,
- }, 'Cancel'),
- ]),
- ])
-
- )
-}
-
-SendTransactionScreen.prototype.toggleTooltip = function () {
- this.setState({ tooltipIsOpen: !this.state.tooltipIsOpen })
-}
-
-SendTransactionScreen.prototype.closeTooltip = function () {
- this.setState({ tooltipIsOpen: false })
-}
-
-SendTransactionScreen.prototype.setActiveCurrency = function (newCurrency) {
- this.setState({ activeCurrency: newCurrency })
-}
-
-SendTransactionScreen.prototype.back = function () {
- var address = this.props.address
- this.props.dispatch(backToAccountDetail(address))
-}
-
-SendTransactionScreen.prototype.validate = function (balance, amountToSend, { to, from }) {
- const sufficientBalance = conversionGreaterThan(
- {
- value: balance,
- fromNumericBase: 'hex',
- },
- {
- value: amountToSend,
- fromNumericBase: 'hex',
- },
- )
-
- const amountLessThanZero = conversionGreaterThan(
- {
- value: 0,
- fromNumericBase: 'dec',
- },
- {
- value: amountToSend,
- fromNumericBase: 'hex',
- },
- )
-
- const errors = {}
-
- if (!sufficientBalance) {
- errors.amount = 'Insufficient funds.'
- }
-
- if (amountLessThanZero) {
- errors.amount = 'Can not send negative amounts of ETH.'
- }
-
- if (!from) {
- errors.from = 'Required'
- }
-
- if (from && !isValidAddress(from)) {
- errors.from = 'Sender address is invalid.'
- }
-
- if (!to) {
- errors.to = 'Required'
- }
-
- if (to && !isValidAddress(to)) {
- errors.to = 'Recipient address is invalid.'
- }
-
- // if (txData && !isHex(stripHexPrefix(txData))) {
- // message = 'Transaction data must be hex string.'
- // return this.props.dispatch(displayWarning(message))
- // }
-
- return {
- isValid: allNull(errors),
- errors,
- }
-}
-
-SendTransactionScreen.prototype.getAmountToSend = function (amount) {
- const { activeCurrency } = this.state
- const { conversionRate } = this.props
-
- return conversionUtil(amount, {
- fromNumericBase: 'dec',
- toNumericBase: 'hex',
- fromCurrency: activeCurrency,
- toCurrency: 'ETH',
- toDenomination: 'WEI',
- conversionRate,
- invertConversionRate: activeCurrency !== 'ETH',
- })
-}
-
-SendTransactionScreen.prototype.setErrorsFor = function (field) {
- const { balance } = this.props
- const { newTx, errors: previousErrors } = this.state
- const { amountToSend } = newTx
-
- const {
- isValid,
- errors: newErrors
- } = this.validate(balance, amountToSend, newTx)
-
- const nextErrors = Object.assign({}, previousErrors, {
- [field]: newErrors[field] || null
- })
-
- if (!isValid) {
- this.setState({
- errors: nextErrors,
- isValid,
- })
- }
-}
-
-SendTransactionScreen.prototype.clearErrorsFor = function (field) {
- const { errors: previousErrors } = this.state
- const nextErrors = Object.assign({}, previousErrors, {
- [field]: null
- })
-
- this.setState({
- errors: nextErrors,
- isValid: allNull(nextErrors),
- })
-}
-
-SendTransactionScreen.prototype.onSubmit = function (event) {
- event.preventDefault()
- const { warning, balance } = this.props
- const state = this.state || {}
-
- const recipient = state.newTx.to
- const sender = state.newTx.from
- const nickname = state.nickname || ' '
-
- // TODO: convert this to hex when created and include it in send
- const txData = state.newTx.memo
-
- this.props.dispatch(hideWarning())
-
- this.props.dispatch(addToAddressBook(recipient, nickname))
-
- var txParams = {
- from: this.state.newTx.from,
- to: this.state.newTx.to,
-
- value: this.state.newTx.amountToSend,
-
- gas: this.state.newTx.gas,
- gasPrice: this.state.newTx.gasPrice,
- }
-
- if (recipient) txParams.to = addHexPrefix(recipient)
- if (txData) txParams.data = txData
-
- this.props.dispatch(signTx(txParams))
-}
+// const { inherits } = require('util')
+// const PersistentForm = require('../lib/persistent-form')
+// const h = require('react-hyperscript')
+// const connect = require('react-redux').connect
+// const Identicon = require('./components/identicon')
+// const EnsInput = require('./components/ens-input')
+// const GasTooltip = require('./components/send/gas-tooltip')
+// const CurrencyToggle = require('./components/send/currency-toggle')
+// const GasFeeDisplay = require('./components/send/gas-fee-display')
+// const { getSelectedIdentity } = require('./selectors')
+
+// const {
+// showAccountsPage,
+// backToAccountDetail,
+// displayWarning,
+// hideWarning,
+// addToAddressBook,
+// signTx,
+// estimateGas,
+// getGasPrice,
+// } = require('./actions')
+// const { stripHexPrefix, addHexPrefix } = require('ethereumjs-util')
+// const { isHex, numericBalance, isValidAddress, allNull } = require('./util')
+// const { conversionUtil, conversionGreaterThan } = require('./conversion-util')
+
+// module.exports = connect(mapStateToProps)(SendTransactionScreen)
+
+// function mapStateToProps (state) {
+// const {
+// selectedAddress: address,
+// accounts,
+// identities,
+// network,
+// addressBook,
+// conversionRate,
+// currentBlockGasLimit: blockGasLimit,
+// } = state.metamask
+// const { warning } = state.appState
+// const selectedIdentity = getSelectedIdentity(state)
+// const account = accounts[address]
+
+// return {
+// address,
+// accounts,
+// identities,
+// network,
+// addressBook,
+// conversionRate,
+// blockGasLimit,
+// warning,
+// selectedIdentity,
+// error: warning && warning.split('.')[0],
+// account,
+// identity: identities[address],
+// balance: account ? account.balance : null,
+// }
+// }
+
+// inherits(SendTransactionScreen, PersistentForm)
+// function SendTransactionScreen () {
+// PersistentForm.call(this)
+
+// // [WIP] These are the bare minimum of tx props needed to sign a transaction
+// // We will need a few more for contract-related interactions
+// this.state = {
+// newTx: {
+// from: '',
+// to: '',
+// amountToSend: '0x0',
+// gasPrice: null,
+// gas: null,
+// amount: '0x0',
+// txData: null,
+// memo: '',
+// },
+// activeCurrency: 'USD',
+// tooltipIsOpen: false,
+// errors: {},
+// isValid: false,
+// }
+
+// this.back = this.back.bind(this)
+// this.closeTooltip = this.closeTooltip.bind(this)
+// this.onSubmit = this.onSubmit.bind(this)
+// this.setActiveCurrency = this.setActiveCurrency.bind(this)
+// this.toggleTooltip = this.toggleTooltip.bind(this)
+// this.validate = this.validate.bind(this)
+// this.getAmountToSend = this.getAmountToSend.bind(this)
+// this.setErrorsFor = this.setErrorsFor.bind(this)
+// this.clearErrorsFor = this.clearErrorsFor.bind(this)
+
+// this.renderFromInput = this.renderFromInput.bind(this)
+// this.renderToInput = this.renderToInput.bind(this)
+// this.renderAmountInput = this.renderAmountInput.bind(this)
+// this.renderGasInput = this.renderGasInput.bind(this)
+// this.renderMemoInput = this.renderMemoInput.bind(this)
+// this.renderErrorMessage = this.renderErrorMessage.bind(this)
+// }
+
+// SendTransactionScreen.prototype.componentWillMount = function () {
+// const { newTx } = this.state
+// const { address } = this.props
+
+// Promise.all([
+// this.props.dispatch(getGasPrice()),
+// this.props.dispatch(estimateGas({
+// from: address,
+// gas: '746a528800',
+// })),
+// ])
+// .then(([blockGasPrice, estimatedGas]) => {
+// console.log({ blockGasPrice, estimatedGas})
+// this.setState({
+// newTx: {
+// ...newTx,
+// gasPrice: blockGasPrice,
+// gas: estimatedGas,
+// },
+// })
+// })
+// }
+
+// SendTransactionScreen.prototype.renderErrorMessage = function(errorType, warning) {
+// const { errors } = this.state
+// const errorMessage = errors[errorType];
+
+// return errorMessage || warning
+// ? h('div.send-screen-input-wrapper__error-message', [ errorMessage || warning ])
+// : null
+// }
+
+// SendTransactionScreen.prototype.renderFromInput = function (from, identities) {
+// return h('div.send-screen-input-wrapper', [
+
+// h('div', 'From:'),
+
+// h('input.large-input.send-screen-input', {
+// list: 'accounts',
+// placeholder: 'Account',
+// value: from,
+// onChange: (event) => {
+// this.setState({
+// newTx: {
+// ...this.state.newTx,
+// from: event.target.value,
+// },
+// })
+// },
+// onBlur: () => this.setErrorsFor('from'),
+// onFocus: event => {
+// this.clearErrorsFor('from')
+// this.state.newTx.from && event.target.select()
+// },
+// }),
+
+// h('datalist#accounts', [
+// Object.entries(identities).map(([key, { address, name }]) => {
+// return h('option', {
+// value: address,
+// label: name,
+// key: address,
+// })
+// }),
+// ]),
+
+// this.renderErrorMessage('from'),
+
+// ])
+// }
+
+// SendTransactionScreen.prototype.renderToInput = function (to, identities, addressBook) {
+// return h('div.send-screen-input-wrapper', [
+
+// h('div', 'To:'),
+
+// h('input.large-input.send-screen-input', {
+// name: 'address',
+// list: 'addresses',
+// placeholder: 'Address',
+// value: to,
+// onChange: (event) => {
+// this.setState({
+// newTx: {
+// ...this.state.newTx,
+// to: event.target.value,
+// },
+// })
+// },
+// onBlur: () => {
+// this.setErrorsFor('to')
+// },
+// onFocus: event => {
+// this.clearErrorsFor('to')
+// this.state.newTx.to && event.target.select()
+// },
+// }),
+
+// h('datalist#addresses', [
+// // Corresponds to the addresses owned.
+// ...Object.entries(identities).map(([key, { address, name }]) => {
+// return h('option', {
+// value: address,
+// label: name,
+// key: address,
+// })
+// }),
+// // Corresponds to previously sent-to addresses.
+// ...addressBook.map(({ address, name }) => {
+// return h('option', {
+// value: address,
+// label: name,
+// key: address,
+// })
+// }),
+// ]),
+
+// this.renderErrorMessage('to'),
+
+// ])
+// }
+
+// SendTransactionScreen.prototype.renderAmountInput = function (activeCurrency) {
+// return h('div.send-screen-input-wrapper', [
+
+// h('div.send-screen-amount-labels', [
+// h('span', 'Amount'),
+// h(CurrencyToggle, {
+// activeCurrency,
+// onClick: (newCurrency) => this.setActiveCurrency(newCurrency),
+// }), // holding on icon from design
+// ]),
+
+// h('input.large-input.send-screen-input', {
+// placeholder: `0 ${activeCurrency}`,
+// type: 'number',
+// onChange: (event) => {
+// const amountToSend = event.target.value
+// ? this.getAmountToSend(event.target.value)
+// : '0x0'
+
+// this.setState({
+// newTx: Object.assign(
+// this.state.newTx,
+// {
+// amount: event.target.value,
+// amountToSend: amountToSend,
+// }
+// ),
+// })
+// },
+// onBlur: () => {
+// this.setErrorsFor('amount')
+// },
+// onFocus: () => this.clearErrorsFor('amount'),
+// }),
+
+// this.renderErrorMessage('amount'),
+
+// ])
+// }
+
+// SendTransactionScreen.prototype.renderGasInput = function (gasPrice, gas, activeCurrency, conversionRate, blockGasLimit) {
+// return h('div.send-screen-input-wrapper', [
+// this.state.tooltipIsOpen && h(GasTooltip, {
+// className: 'send-tooltip',
+// gasPrice,
+// gasLimit: gas,
+// onClose: this.closeTooltip,
+// onFeeChange: ({gasLimit, gasPrice}) => {
+// this.setState({
+// newTx: {
+// ...this.state.newTx,
+// gas: gasLimit,
+// gasPrice,
+// },
+// })
+// },
+// }),
+
+// h('div.send-screen-gas-labels', [
+// h('span', [
+// h('i.fa.fa-bolt'),
+// 'Gas fee:',
+// ]),
+// h('span', 'What\'s this?'),
+// ]),
+
+// // TODO: handle loading time when switching to USD
+// h('div.large-input.send-screen-gas-input', {}, [
+// h(GasFeeDisplay, {
+// activeCurrency,
+// conversionRate,
+// gas,
+// gasPrice,
+// blockGasLimit,
+// }),
+// h('div.send-screen-gas-input-customize', {
+// onClick: this.toggleTooltip,
+// }, [
+// 'Customize',
+// ]),
+// ]),
+
+// ])
+// }
+
+// SendTransactionScreen.prototype.renderMemoInput = function () {
+// return h('div.send-screen-input-wrapper', [
+// h('div', 'Transaction memo (optional)'),
+// h('input.large-input.send-screen-input', {
+// onChange: () => {
+// this.setState({
+// newTx: Object.assign(
+// this.state.newTx,
+// {
+// memo: event.target.value,
+// }
+// ),
+// })
+// },
+// }),
+// ])
+// }
+
+// SendTransactionScreen.prototype.render = function () {
+// this.persistentFormParentId = 'send-tx-form'
+
+// const props = this.props
+// const {
+// warning,
+// identities,
+// addressBook,
+// conversionRate,
+// } = props
+
+// const {
+// blockGasLimit,
+// newTx,
+// activeCurrency,
+// isValid,
+// } = this.state
+// const { gas, gasPrice } = newTx
+
+// return (
+
+// h('div.send-screen-wrapper', [
+// // Main Send token Card
+// h('div.send-screen-card', [
+
+// h('img.send-eth-icon', { src: '../images/eth_logo.svg' }),
+
+// h('div.send-screen__title', 'Send'),
+
+// h('div.send-screen__subtitle', 'Send Ethereum to anyone with an Ethereum account'),
+
+// this.renderFromInput(this.state.newTx.from, identities),
+
+// this.renderToInput(this.state.newTx.to, identities, addressBook),
+
+// this.renderAmountInput(activeCurrency),
+
+// this.renderGasInput(
+// gasPrice || '0x0',
+// gas || '0x0',
+// activeCurrency,
+// conversionRate,
+// blockGasLimit
+// ),
+
+// this.renderMemoInput(),
+
+// this.renderErrorMessage(null, warning),
+
+// ]),
+
+// // Buttons underneath card
+// h('section.flex-column.flex-center', [
+// h('button.btn-secondary.send-screen__send-button', {
+// className: !isValid && 'send-screen__send-button__disabled',
+// onClick: (event) => isValid && this.onSubmit(event),
+// }, 'Next'),
+// h('button.btn-tertiary.send-screen__cancel-button', {
+// onClick: this.back,
+// }, 'Cancel'),
+// ]),
+// ])
+
+// )
+// }
+
+// SendTransactionScreen.prototype.toggleTooltip = function () {
+// this.setState({ tooltipIsOpen: !this.state.tooltipIsOpen })
+// }
+
+// SendTransactionScreen.prototype.closeTooltip = function () {
+// this.setState({ tooltipIsOpen: false })
+// }
+
+// SendTransactionScreen.prototype.setActiveCurrency = function (newCurrency) {
+// this.setState({ activeCurrency: newCurrency })
+// }
+
+// SendTransactionScreen.prototype.back = function () {
+// var address = this.props.address
+// this.props.dispatch(backToAccountDetail(address))
+// }
+
+// SendTransactionScreen.prototype.validate = function (balance, amountToSend, { to, from }) {
+// const sufficientBalance = conversionGreaterThan(
+// {
+// value: balance,
+// fromNumericBase: 'hex',
+// },
+// {
+// value: amountToSend,
+// fromNumericBase: 'hex',
+// },
+// )
+
+// const amountLessThanZero = conversionGreaterThan(
+// {
+// value: 0,
+// fromNumericBase: 'dec',
+// },
+// {
+// value: amountToSend,
+// fromNumericBase: 'hex',
+// },
+// )
+
+// const errors = {}
+
+// if (!sufficientBalance) {
+// errors.amount = 'Insufficient funds.'
+// }
+
+// if (amountLessThanZero) {
+// errors.amount = 'Can not send negative amounts of ETH.'
+// }
+
+// if (!from) {
+// errors.from = 'Required'
+// }
+
+// if (from && !isValidAddress(from)) {
+// errors.from = 'Sender address is invalid.'
+// }
+
+// if (!to) {
+// errors.to = 'Required'
+// }
+
+// if (to && !isValidAddress(to)) {
+// errors.to = 'Recipient address is invalid.'
+// }
+
+// // if (txData && !isHex(stripHexPrefix(txData))) {
+// // message = 'Transaction data must be hex string.'
+// // return this.props.dispatch(displayWarning(message))
+// // }
+
+// return {
+// isValid: allNull(errors),
+// errors,
+// }
+// }
+
+// SendTransactionScreen.prototype.getAmountToSend = function (amount) {
+// const { activeCurrency } = this.state
+// const { conversionRate } = this.props
+
+// return conversionUtil(amount, {
+// fromNumericBase: 'dec',
+// toNumericBase: 'hex',
+// fromCurrency: activeCurrency,
+// toCurrency: 'ETH',
+// toDenomination: 'WEI',
+// conversionRate,
+// invertConversionRate: activeCurrency !== 'ETH',
+// })
+// }
+
+// SendTransactionScreen.prototype.setErrorsFor = function (field) {
+// const { balance } = this.props
+// const { newTx, errors: previousErrors } = this.state
+// const { amountToSend } = newTx
+
+// const {
+// isValid,
+// errors: newErrors
+// } = this.validate(balance, amountToSend, newTx)
+
+// const nextErrors = Object.assign({}, previousErrors, {
+// [field]: newErrors[field] || null
+// })
+
+// if (!isValid) {
+// this.setState({
+// errors: nextErrors,
+// isValid,
+// })
+// }
+// }
+
+// SendTransactionScreen.prototype.clearErrorsFor = function (field) {
+// const { errors: previousErrors } = this.state
+// const nextErrors = Object.assign({}, previousErrors, {
+// [field]: null
+// })
+
+// this.setState({
+// errors: nextErrors,
+// isValid: allNull(nextErrors),
+// })
+// }
+
+// SendTransactionScreen.prototype.onSubmit = function (event) {
+// event.preventDefault()
+// const { warning, balance } = this.props
+// const state = this.state || {}
+
+// const recipient = state.newTx.to
+// const sender = state.newTx.from
+// const nickname = state.nickname || ' '
+
+// // TODO: convert this to hex when created and include it in send
+// const txData = state.newTx.memo
+
+// this.props.dispatch(hideWarning())
+
+// this.props.dispatch(addToAddressBook(recipient, nickname))
+
+// var txParams = {
+// from: this.state.newTx.from,
+// to: this.state.newTx.to,
+
+// value: this.state.newTx.amountToSend,
+
+// gas: this.state.newTx.gas,
+// gasPrice: this.state.newTx.gasPrice,
+// }
+
+// if (recipient) txParams.to = addHexPrefix(recipient)
+// if (txData) txParams.data = txData
+
+// this.props.dispatch(signTx(txParams))
+// }