From 62febac87659ddf78a34dd0dac1ee8a38d8c8e77 Mon Sep 17 00:00:00 2001 From: frankiebee Date: Tue, 27 Feb 2018 15:14:18 -0800 Subject: refactor retrytx with higher gas price: - create a new tx instead of overwriting the tx hash - add a new state 'dropped' to the txStateManager - mark duplicate txs as dropped when one gets confirmed in a block --- app/scripts/controllers/transactions.js | 43 +++++++++++++++++++++------------ app/scripts/lib/tx-state-manager.js | 38 +++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/app/scripts/controllers/transactions.js b/app/scripts/controllers/transactions.js index ef5578d5a..aad3f9952 100644 --- a/app/scripts/controllers/transactions.js +++ b/app/scripts/controllers/transactions.js @@ -6,7 +6,6 @@ const EthQuery = require('ethjs-query') const TransactionStateManger = require('../lib/tx-state-manager') const TxGasUtil = require('../lib/tx-gas-utils') const PendingTransactionTracker = require('../lib/pending-tx-tracker') -const createId = require('../lib/random-id') const NonceTracker = require('../lib/nonce-tracker') /* @@ -92,8 +91,22 @@ module.exports = class TransactionController extends EventEmitter { this.pendingTxTracker.on('tx:warning', (txMeta) => { this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:warning') }) + this.pendingTxTracker.on('tx:confirmed', (txId) => { + this.txStateManager.setTxStatusConfirmed(txId) + // get the confirmed transactions nonce and from address + const txMeta = this.txStateManager.getTx(txId) + const { nonce, from } = txMeta.txParams + const sameNonceTxs = this.txStateManager.getFilteredTxList({nonce, from}) + if (!sameNonceTxs.length) return + // mark all same nonce transactions as dropped and give i a replacedBy hash + sameNonceTxs.forEach((otherTxMeta) => { + if (otherTxMeta === txId) return + otherTxMeta.replacedBy = txMeta.hash + this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:confirmed reference to confirmed txHash with same nonce') + this.txStateManager.setTxStatusDropped(otherTxMeta.id) + }) + }) this.pendingTxTracker.on('tx:failed', this.txStateManager.setTxStatusFailed.bind(this.txStateManager)) - this.pendingTxTracker.on('tx:confirmed', this.txStateManager.setTxStatusConfirmed.bind(this.txStateManager)) this.pendingTxTracker.on('tx:block-update', (txMeta, latestBlockNumber) => { if (!txMeta.firstRetryBlockNumber) { txMeta.firstRetryBlockNumber = latestBlockNumber @@ -186,14 +199,7 @@ module.exports = class TransactionController extends EventEmitter { // validate await this.txGasUtil.validateTxParams(txParams) // construct txMeta - const txMeta = { - id: createId(), - time: (new Date()).getTime(), - status: 'unapproved', - metamaskNetworkId: this.getNetwork(), - txParams: txParams, - loadingDefaults: true, - } + const txMeta = this.txStateManager.generateTxMeta({txParams}) this.addTx(txMeta) this.emit('newUnapprovedTx', txMeta) // add default tx params @@ -215,7 +221,6 @@ module.exports = class TransactionController extends EventEmitter { const txParams = txMeta.txParams // ensure value txMeta.gasPriceSpecified = Boolean(txParams.gasPrice) - txMeta.nonceSpecified = Boolean(txParams.nonce) let gasPrice = txParams.gasPrice if (!gasPrice) { gasPrice = this.getGasPrice ? this.getGasPrice() : await this.query.gasPrice() @@ -226,11 +231,17 @@ module.exports = class TransactionController extends EventEmitter { return await this.txGasUtil.analyzeGasUsage(txMeta) } - async retryTransaction (txId) { - this.txStateManager.setTxStatusUnapproved(txId) - const txMeta = this.txStateManager.getTx(txId) - txMeta.lastGasPrice = txMeta.txParams.gasPrice - this.txStateManager.updateTx(txMeta, 'retryTransaction: manual retry') + async retryTransaction (originalTxId) { + const originalTxMeta = this.txStateManager.getTx(originalTxId) + const lastGasPrice = originalTxMeta.txParams.gasPrice + const txMeta = this.txStateManager.generateTxMeta({ + txParams: originalTxMeta.txParams, + lastGasPrice, + loadingDefaults: false, + nonceSpecified: true, + }) + this.addTx(txMeta) + this.emit('newUnapprovedTx', txMeta) } async updateTransaction (txMeta) { diff --git a/app/scripts/lib/tx-state-manager.js b/app/scripts/lib/tx-state-manager.js index 051efd247..25442ce47 100644 --- a/app/scripts/lib/tx-state-manager.js +++ b/app/scripts/lib/tx-state-manager.js @@ -1,9 +1,21 @@ const extend = require('xtend') const EventEmitter = require('events') const ObservableStore = require('obs-store') +const createId = require('./random-id') const ethUtil = require('ethereumjs-util') const txStateHistoryHelper = require('./tx-state-history-helper') +// STATUS METHODS + // statuses: + // - `'unapproved'` the user has not responded + // - `'rejected'` the user has responded no! + // - `'approved'` the user has approved the tx + // - `'signed'` the tx is signed + // - `'submitted'` the tx is sent to a server + // - `'confirmed'` the tx has been included in a block. + // - `'failed'` the tx failed for some reason, included on tx data. + // - `'dropped'` the tx nonce was already used + module.exports = class TransactionStateManger extends EventEmitter { constructor ({ initState, txHistoryLimit, getNetwork }) { super() @@ -16,6 +28,16 @@ module.exports = class TransactionStateManger extends EventEmitter { this.getNetwork = getNetwork } + generateTxMeta (opts) { + return extend({ + id: createId(), + time: (new Date()).getTime(), + status: 'unapproved', + metamaskNetworkId: this.getNetwork(), + loadingDefaults: true, + }, opts) + } + // Returns the number of txs for the current network. getTxCount () { return this.getTxList().length @@ -164,16 +186,6 @@ module.exports = class TransactionStateManger extends EventEmitter { }) } - // STATUS METHODS - // statuses: - // - `'unapproved'` the user has not responded - // - `'rejected'` the user has responded no! - // - `'approved'` the user has approved the tx - // - `'signed'` the tx is signed - // - `'submitted'` the tx is sent to a server - // - `'confirmed'` the tx has been included in a block. - // - `'failed'` the tx failed for some reason, included on tx data. - // get::set status // should return the status of the tx. @@ -211,6 +223,12 @@ module.exports = class TransactionStateManger extends EventEmitter { this._setTxStatus(txId, 'confirmed') } + // should update the status dropped + setTxStatusDropped (txId) { + this._setTxStatus(txId, 'dropped') + } + + setTxStatusFailed (txId, err) { const txMeta = this.getTx(txId) txMeta.err = { -- cgit From 4a3288fec9ae7bd717b539d9bfcb8d5ba5b1ef8c Mon Sep 17 00:00:00 2001 From: frankiebee Date: Wed, 7 Mar 2018 22:01:14 -0800 Subject: transactions - make _markNonceDuplicatesDropped --- app/scripts/controllers/transactions.js | 41 ++++++++++++++++----------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/app/scripts/controllers/transactions.js b/app/scripts/controllers/transactions.js index aad3f9952..e903c73e8 100644 --- a/app/scripts/controllers/transactions.js +++ b/app/scripts/controllers/transactions.js @@ -91,21 +91,7 @@ module.exports = class TransactionController extends EventEmitter { this.pendingTxTracker.on('tx:warning', (txMeta) => { this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:warning') }) - this.pendingTxTracker.on('tx:confirmed', (txId) => { - this.txStateManager.setTxStatusConfirmed(txId) - // get the confirmed transactions nonce and from address - const txMeta = this.txStateManager.getTx(txId) - const { nonce, from } = txMeta.txParams - const sameNonceTxs = this.txStateManager.getFilteredTxList({nonce, from}) - if (!sameNonceTxs.length) return - // mark all same nonce transactions as dropped and give i a replacedBy hash - sameNonceTxs.forEach((otherTxMeta) => { - if (otherTxMeta === txId) return - otherTxMeta.replacedBy = txMeta.hash - this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:confirmed reference to confirmed txHash with same nonce') - this.txStateManager.setTxStatusDropped(otherTxMeta.id) - }) - }) + this.pendingTxTracker.on('tx:confirmed', (txId) => this._markNonceDuplicatesDropped(txId)) this.pendingTxTracker.on('tx:failed', this.txStateManager.setTxStatusFailed.bind(this.txStateManager)) this.pendingTxTracker.on('tx:block-update', (txMeta, latestBlockNumber) => { if (!txMeta.firstRetryBlockNumber) { @@ -238,7 +224,6 @@ module.exports = class TransactionController extends EventEmitter { txParams: originalTxMeta.txParams, lastGasPrice, loadingDefaults: false, - nonceSpecified: true, }) this.addTx(txMeta) this.emit('newUnapprovedTx', txMeta) @@ -264,11 +249,9 @@ module.exports = class TransactionController extends EventEmitter { // wait for a nonce nonceLock = await this.nonceTracker.getNonceLock(fromAddress) // add nonce to txParams - const nonce = txMeta.nonceSpecified ? txMeta.txParams.nonce : nonceLock.nextNonce - if (nonce > nonceLock.nextNonce) { - const message = `Specified nonce may not be larger than account's next valid nonce.` - throw new Error(message) - } + // if txMeta has lastGasPrice then it is a retry at same nonce with higher + // gas price transaction and their for the nonce should not be calculated + const nonce = txMeta.lastGasPrice ? txMeta.txParams.nonce : nonceLock.nextNonce txMeta.txParams.nonce = ethUtil.addHexPrefix(nonce.toString(16)) // add nonce debugging information to txMeta txMeta.nonceDetails = nonceLock.nonceDetails @@ -325,6 +308,22 @@ module.exports = class TransactionController extends EventEmitter { // PRIVATE METHODS // + _markNonceDuplicatesDropped (txId) { + this.txStateManager.setTxStatusConfirmed(txId) + // get the confirmed transactions nonce and from address + const txMeta = this.txStateManager.getTx(txId) + const { nonce, from } = txMeta.txParams + const sameNonceTxs = this.txStateManager.getFilteredTxList({nonce, from}) + if (!sameNonceTxs.length) return + // mark all same nonce transactions as dropped and give i a replacedBy hash + sameNonceTxs.forEach((otherTxMeta) => { + if (otherTxMeta === txId) return + otherTxMeta.replacedBy = txMeta.hash + this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:confirmed reference to confirmed txHash with same nonce') + this.txStateManager.setTxStatusDropped(otherTxMeta.id) + }) + } + _updateMemstore () { const unapprovedTxs = this.txStateManager.getUnapprovedTxList() const selectedAddressTxList = this.txStateManager.getFilteredTxList({ -- cgit From 5572345b781ce68178dd4e72d4e56b2dec26a454 Mon Sep 17 00:00:00 2001 From: frankiebee Date: Thu, 8 Mar 2018 10:36:31 -0800 Subject: fix marking of confirmed transaction as dropped --- app/scripts/controllers/transactions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/controllers/transactions.js b/app/scripts/controllers/transactions.js index e903c73e8..3dbd424ca 100644 --- a/app/scripts/controllers/transactions.js +++ b/app/scripts/controllers/transactions.js @@ -317,7 +317,7 @@ module.exports = class TransactionController extends EventEmitter { if (!sameNonceTxs.length) return // mark all same nonce transactions as dropped and give i a replacedBy hash sameNonceTxs.forEach((otherTxMeta) => { - if (otherTxMeta === txId) return + if (otherTxMeta.id === txId) return otherTxMeta.replacedBy = txMeta.hash this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:confirmed reference to confirmed txHash with same nonce') this.txStateManager.setTxStatusDropped(otherTxMeta.id) -- cgit From 6cee76b3e797dd302c1bf97d7799567a366b2004 Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 8 Mar 2018 16:12:25 -0330 Subject: Add html and css for responsive retry button. --- ui/app/components/tx-list-item.js | 9 +++++ ui/app/css/itcss/components/transaction-list.scss | 47 +++++++++++++++++++++++ ui/app/css/itcss/settings/variables.scss | 1 + 3 files changed, 57 insertions(+) diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index 1a13070c8..574d10e14 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -240,6 +240,15 @@ TxListItem.prototype.render = function () { ]), ]), + + h('div.tx-list-item-retry-container', [ + + h('span.tx-list-item-retry-copy', 'Taking too long?'), + + h('span.tx-list-item-retry-link', 'Increase the gas on your transaction'), + + ]), + ]), // holding on icon from design ]) } diff --git a/ui/app/css/itcss/components/transaction-list.scss b/ui/app/css/itcss/components/transaction-list.scss index c3df493df..4545897e3 100644 --- a/ui/app/css/itcss/components/transaction-list.scss +++ b/ui/app/css/itcss/components/transaction-list.scss @@ -126,6 +126,53 @@ } } +.tx-list-item-retry-container { + background: #d1edff; + width: 100%; + border-radius: 4px; + font-size: 0.8em; + display: flex; + justify-content: center; + margin-left: 44px; + width: calc(100% - 44px); + + @media screen and (min-width: 576px) and (max-width: 679px) { + flex-flow: column; + align-items: center; + } + + @media screen and (min-width: 380px) and (max-width: 575px) { + flex-flow: row; + } + + @media screen and (max-width: 379px) { + flex-flow: column; + align-items: center; + } +} + +.tx-list-item-retry-copy { + font-family: Roboto; +} + +.tx-list-item-retry-link { + text-decoration: underline; + margin-left: 6px; + cursor: pointer; + + @media screen and (min-width: 576px) and (max-width: 679px) { + margin-left: 0px; + } + + @media screen and (min-width: 380px) and (max-width: 575px) { + margin-left: 6px; + } + + @media screen and (max-width: 379px) { + margin-left: 0px; + } +} + .tx-list-date { color: $dusty-gray; font-size: 12px; diff --git a/ui/app/css/itcss/settings/variables.scss b/ui/app/css/itcss/settings/variables.scss index 4c0972527..1b5f1a491 100644 --- a/ui/app/css/itcss/settings/variables.scss +++ b/ui/app/css/itcss/settings/variables.scss @@ -46,6 +46,7 @@ $manatee: #93949d; $spindle: #c7ddec; $mid-gray: #5b5d67; $cape-cod: #38393a; +$onahau: #d1edff; /* Z-Indicies -- cgit From 5433d2fe3a3f48948449258b03ae431fe81b8cf2 Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 9 Mar 2018 00:19:26 -0330 Subject: Retry transaction logic added to tx-list-item, confirm-send-ether, customize-gas-modal, and dependents. --- ui/app/actions.js | 4 +- ui/app/components/customize-gas-modal/index.js | 18 ++++++++- ui/app/components/pending-tx/confirm-send-ether.js | 20 ++++++++- ui/app/components/tx-list-item.js | 47 ++++++++++++++++++---- ui/app/components/tx-list.js | 13 +++--- ui/app/conversion-util.js | 13 ++++++ ui/app/reducers/metamask.js | 4 ++ ui/app/selectors.js | 5 +++ ui/app/send-v2.js | 5 +++ 9 files changed, 113 insertions(+), 16 deletions(-) diff --git a/ui/app/actions.js b/ui/app/actions.js index 4f902a6a2..3e050c38c 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -1228,8 +1228,10 @@ function retryTransaction (txId) { if (err) { return dispatch(actions.displayWarning(err.message)) } + const { selectedAddressTxList } = newState + const { id: newTxId } = selectedAddressTxList[selectedAddressTxList.length - 1] dispatch(actions.updateMetamaskState(newState)) - dispatch(actions.viewPendingTx(txId)) + dispatch(actions.viewPendingTx(newTxId)) }) } } diff --git a/ui/app/components/customize-gas-modal/index.js b/ui/app/components/customize-gas-modal/index.js index 826d2cd4b..34a93d6c6 100644 --- a/ui/app/components/customize-gas-modal/index.js +++ b/ui/app/components/customize-gas-modal/index.js @@ -21,12 +21,14 @@ const { conversionUtil, multiplyCurrencies, conversionGreaterThan, + conversionMax, subtractCurrencies, } = require('../../conversion-util') const { getGasPrice, getGasLimit, + getForceGasMin, conversionRateSelector, getSendAmount, getSelectedToken, @@ -44,6 +46,7 @@ function mapStateToProps (state) { return { gasPrice: getGasPrice(state), gasLimit: getGasLimit(state), + forceGasMin: getForceGasMin(state), conversionRate, amount: getSendAmount(state), maxModeOn: getSendMaxModeState(state), @@ -217,7 +220,7 @@ CustomizeGasModal.prototype.convertAndSetGasPrice = function (newGasPrice) { } CustomizeGasModal.prototype.render = function () { - const { hideModal } = this.props + const { hideModal, forceGasMin } = this.props const { gasPrice, gasLimit, gasTotal, error, priceSigZeros, priceSigDec } = this.state let convertedGasPrice = conversionUtil(gasPrice, { @@ -229,6 +232,17 @@ CustomizeGasModal.prototype.render = function () { convertedGasPrice += convertedGasPrice.match(/[.]/) ? priceSigZeros : `${priceSigDec}${priceSigZeros}` + if (forceGasMin) { + const convertedMinPrice = conversionUtil(forceGasMin, { + fromNumericBase: 'hex', + toNumericBase: 'dec', + }) + convertedGasPrice = conversionMax( + { value: convertedMinPrice, fromNumericBase: 'dec' }, + { value: convertedGasPrice, fromNumericBase: 'dec' } + ) + } + const convertedGasLimit = conversionUtil(gasLimit, { fromNumericBase: 'hex', toNumericBase: 'dec', @@ -251,7 +265,7 @@ CustomizeGasModal.prototype.render = function () { h(GasModalCard, { value: convertedGasPrice, - min: MIN_GAS_PRICE_GWEI, + min: forceGasMin || MIN_GAS_PRICE_GWEI, // max: 1000, step: multiplyCurrencies(MIN_GAS_PRICE_GWEI, 10), onChange: value => this.convertAndSetGasPrice(value), diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index 3f8d9c28f..a6e00d922 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -36,13 +36,29 @@ function mapDispatchToProps (dispatch) { return { clearSend: () => dispatch(actions.clearSend()), editTransaction: txMeta => { - const { id, txParams } = txMeta + const { id, txParams, lastGasPrice } = txMeta const { gas: gasLimit, gasPrice, to, value: amount, } = txParams + + let forceGasMin + let nonce + if (lastGasPrice) { + const stripped = ethUtil.stripHexPrefix(lastGasPrice) + forceGasMin = ethUtil.addHexPrefix(addCurrencies(stripped, MIN_GAS_PRICE_HEX, { + aBase: 16, + bBase: 16, + toNumericBase: 'hex', + fromDenomination: 'WEI', + toDenomination: 'GWEI', + })) + + nonce = txParams.nonce + } + dispatch(actions.updateSend({ gasLimit, gasPrice, @@ -51,6 +67,8 @@ function mapDispatchToProps (dispatch) { amount, errors: { to: null, amount: null }, editingTransactionId: id, + forceGasMin, + nonce, })) dispatch(actions.showSendPage()) }, diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index 574d10e14..123f723be 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -9,18 +9,26 @@ abiDecoder.addABI(abi) const Identicon = require('./identicon') const contractMap = require('eth-contract-metadata') +const actions = require('../actions') const { conversionUtil, multiplyCurrencies } = require('../conversion-util') const { calcTokenAmount } = require('../token-util') const { getCurrentCurrency } = require('../selectors') -module.exports = connect(mapStateToProps)(TxListItem) +module.exports = connect(mapStateToProps, mapDispatchToProps)(TxListItem) function mapStateToProps (state) { return { tokens: state.metamask.tokens, currentCurrency: getCurrentCurrency(state), tokenExchangeRates: state.metamask.tokenExchangeRates, + selectedAddressTxList: state.metamask.selectedAddressTxList, + } +} + +function mapDispatchToProps (dispatch) { + return { + retryTransaction: transactionId => dispatch(actions.retryTransaction(transactionId)), } } @@ -167,12 +175,32 @@ TxListItem.prototype.getSendTokenTotal = async function () { } } +TxListItem.prototype.showRetryButton = function () { + const { + transactionStatus, + transactionTime, + selectedAddressTxList, + transactionId, + txParams, + } = this.props + const currentNonce = txParams.nonce + const currentNonceTxs = selectedAddressTxList.filter(tx => tx.txParams.nonce === currentNonce) + const isLastWithNonce = currentNonceTxs[currentNonceTxs.length - 1].id === transactionId + + return transactionStatus === 'submitted' && isLastWithNonce && Date.now() - transactionTime > 5000 +} + +TxListItem.prototype.resubmit = function () { + const { transactionId } = this.props + this.props.retryTransaction(transactionId) +} + TxListItem.prototype.render = function () { const { transactionStatus, transactionAmount, onClick, - transActionId, + transactionId, dateString, address, className, @@ -181,8 +209,8 @@ TxListItem.prototype.render = function () { const showFiatTotal = transactionAmount !== '0x0' && fiatTotal return h(`div${className || ''}`, { - key: transActionId, - onClick: () => onClick && onClick(transActionId), + key: transactionId, + onClick: () => onClick && onClick(transactionId), }, [ h(`div.flex-column.tx-list-item-wrapper`, {}, [ @@ -241,12 +269,17 @@ TxListItem.prototype.render = function () { ]), ]), - h('div.tx-list-item-retry-container', [ + this.showRetryButton() && h('div.tx-list-item-retry-container', [ h('span.tx-list-item-retry-copy', 'Taking too long?'), - h('span.tx-list-item-retry-link', 'Increase the gas on your transaction'), - + h('span.tx-list-item-retry-link', { + onClick: (event) => { + event.stopPropagation() + this.resubmit() + }, + }, 'Increase the gas on your transaction'), + ]), ]), // holding on icon from design diff --git a/ui/app/components/tx-list.js b/ui/app/components/tx-list.js index 1729e6a6f..30f816d58 100644 --- a/ui/app/components/tx-list.js +++ b/ui/app/components/tx-list.js @@ -74,9 +74,10 @@ TxList.prototype.renderTransactionListItem = function (transaction, conversionRa address: transaction.txParams.to, transactionStatus: transaction.status, transactionAmount: transaction.txParams.value, - transActionId: transaction.id, + transactionId: transaction.id, transactionHash: transaction.hash, transactionNetworkId: transaction.metamaskNetworkId, + transactionTime: transaction.time, } const { @@ -84,29 +85,31 @@ TxList.prototype.renderTransactionListItem = function (transaction, conversionRa transactionStatus, transactionAmount, dateString, - transActionId, + transactionId, transactionHash, transactionNetworkId, + transactionTime, } = props const { showConfTxPage } = this.props const opts = { - key: transActionId || transactionHash, + key: transactionId || transactionHash, txParams: transaction.txParams, transactionStatus, - transActionId, + transactionId, dateString, address, transactionAmount, transactionHash, conversionRate, tokenInfoGetter: this.tokenInfoGetter, + transactionTime, } const isUnapproved = transactionStatus === 'unapproved' if (isUnapproved) { - opts.onClick = () => showConfTxPage({id: transActionId}) + opts.onClick = () => showConfTxPage({id: transactionId}) opts.transactionStatus = 'Not Started' } else if (transactionHash) { opts.onClick = () => this.view(transactionHash, transactionNetworkId) diff --git a/ui/app/conversion-util.js b/ui/app/conversion-util.js index ee42ebea1..d484ed16d 100644 --- a/ui/app/conversion-util.js +++ b/ui/app/conversion-util.js @@ -187,6 +187,18 @@ const conversionGreaterThan = ( return firstValue.gt(secondValue) } +const conversionMax = ( + { ...firstProps }, + { ...secondProps }, +) => { + const firstIsGreater = conversionGreaterThan( + { ...firstProps }, + { ...secondProps } + ) + + return firstIsGreater ? firstProps.value : secondProps.value +} + const conversionGTE = ( { ...firstProps }, { ...secondProps }, @@ -216,6 +228,7 @@ module.exports = { conversionGreaterThan, conversionGTE, conversionLTE, + conversionMax, toNegative, subtractCurrencies, } diff --git a/ui/app/reducers/metamask.js b/ui/app/reducers/metamask.js index cddcd0c1f..999939b89 100644 --- a/ui/app/reducers/metamask.js +++ b/ui/app/reducers/metamask.js @@ -38,6 +38,8 @@ function reduceMetamask (state, action) { errors: {}, maxModeOn: false, editingTransactionId: null, + forceGasMin: null, + nonce: null, }, coinOptions: {}, useBlockie: false, @@ -298,6 +300,8 @@ function reduceMetamask (state, action) { memo: '', errors: {}, editingTransactionId: null, + forceGasMin: null, + nonce: null, }, }) diff --git a/ui/app/selectors.js b/ui/app/selectors.js index 5d2635775..d37c26f7e 100644 --- a/ui/app/selectors.js +++ b/ui/app/selectors.js @@ -18,6 +18,7 @@ const selectors = { getCurrentAccountWithSendEtherInfo, getGasPrice, getGasLimit, + getForceGasMin, getAddressBook, getSendFrom, getCurrentCurrency, @@ -130,6 +131,10 @@ function getGasLimit (state) { return state.metamask.send.gasLimit } +function getForceGasMin (state) { + return state.metamask.send.forceGasMin +} + function getSendFrom (state) { return state.metamask.send.from } diff --git a/ui/app/send-v2.js b/ui/app/send-v2.js index 1d67150e3..edb6bc41d 100644 --- a/ui/app/send-v2.js +++ b/ui/app/send-v2.js @@ -543,6 +543,7 @@ SendTransactionScreen.prototype.getEditedTx = function () { selectedToken, editingTransactionId, unapprovedTxs, + nonce, } = this.props const editingTx = { @@ -554,6 +555,10 @@ SendTransactionScreen.prototype.getEditedTx = function () { }, } + if (nonce) { + editingTx.txParams.nonce = ethUtil.addHexPrefix(nonce) + } + if (selectedToken) { const data = TOKEN_TRANSFER_FUNCTION_SIGNATURE + Array.prototype.map.call( ethAbi.rawEncode(['address', 'uint256'], [to, ethUtil.addHexPrefix(amount)]), -- cgit From 2d6b378bf8f8f0b23ef54b48118b61fb6c7deee1 Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 9 Mar 2018 02:03:36 -0330 Subject: Adds inline opening of gas customization to confirm-send-ether screen. --- ui/app/components/pending-tx/confirm-send-ether.js | 48 ++++++++++++++++++---- ui/app/components/send/gas-fee-display-v2.js | 4 +- ui/app/css/itcss/components/send.scss | 21 ++++++++++ 3 files changed, 63 insertions(+), 10 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index a6e00d922..422b1c6c1 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -9,6 +9,7 @@ const ethUtil = require('ethereumjs-util') const BN = ethUtil.BN const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') const { conversionUtil, addCurrencies } = require('../../conversion-util') +const GasFeeDisplay = require('../send/gas-fee-display-v2') const { MIN_GAS_PRICE_HEX } = require('../send/send-constants') @@ -73,6 +74,18 @@ function mapDispatchToProps (dispatch) { dispatch(actions.showSendPage()) }, cancelTransaction: ({ id }) => dispatch(actions.cancelTx({ id })), + showCustomizeGasModal: (txMeta, sendGasLimit, sendGasPrice, sendGasTotal) => { + const { id, txParams } = txMeta + const { gas: txGasLimit, gasPrice: txGasPrice } = txParams + + dispatch(actions.updateSend({ + gasLimit: sendGasLimit || txGasLimit, + gasPrice: sendGasPrice || txGasPrice, + editingTransactionId: id, + gasTotal: sendGasTotal, + })) + dispatch(actions.showModal({ name: 'CUSTOMIZE_GAS' })) + }, } } @@ -157,6 +170,7 @@ ConfirmSendEther.prototype.getGasFee = function () { return { FIAT, ETH, + gasFeeInHex: txFeeBn.toString(16), } } @@ -164,7 +178,7 @@ ConfirmSendEther.prototype.getData = function () { const { identities } = this.props const txMeta = this.gatherTxMeta() const txParams = txMeta.txParams || {} - const { FIAT: gasFeeInFIAT, ETH: gasFeeInETH } = this.getGasFee() + const { FIAT: gasFeeInFIAT, ETH: gasFeeInETH, gasFeeInHex } = this.getGasFee() const { FIAT: amountInFIAT, ETH: amountInETH } = this.getAmount() const totalInFIAT = addCurrencies(gasFeeInFIAT, amountInFIAT, { @@ -192,11 +206,20 @@ ConfirmSendEther.prototype.getData = function () { amountInETH, totalInFIAT, totalInETH, + gasFeeInHex, } } ConfirmSendEther.prototype.render = function () { - const { editTransaction, currentCurrency, clearSend } = this.props + const { + editTransaction, + currentCurrency, + clearSend, + conversionRate, + currentCurrency: convertedCurrency, + showCustomizeGasModal, + send: { gasTotal, gasLimit: sendGasLimit, gasPrice: sendGasPrice }, + } = this.props const txMeta = this.gatherTxMeta() const txParams = txMeta.txParams || {} @@ -212,11 +235,17 @@ ConfirmSendEther.prototype.render = function () { memo, gasFeeInFIAT, gasFeeInETH, + gasFeeInHex, amountInFIAT, totalInFIAT, totalInETH, } = this.getData() + const title = txMeta.lastGasPrice ? 'Overwrite Transaction' : 'Confirm' + const subtitle = txMeta.lastGasPrice + ? 'Increase your gas fee to attempt to overwrite and speed up your transaction' + : 'Please review your transaction.' + // This is from the latest master // It handles some of the errors that we are not currently handling // Leaving as comments fo reference @@ -235,11 +264,11 @@ ConfirmSendEther.prototype.render = function () { // Main Send token Card h('div.page-container', [ h('div.page-container__header', [ - h('button.confirm-screen-back-button', { + !txMeta.lastGasPrice && h('button.confirm-screen-back-button', { onClick: () => editTransaction(txMeta), }, 'Edit'), - h('div.page-container__title', 'Confirm'), - h('div.page-container__subtitle', `Please review your transaction.`), + h('div.page-container__title', title), + h('div.page-container__subtitle', subtitle), ]), h('div.flex-row.flex-center.confirm-screen-identicons', [ h('div.confirm-screen-account-wrapper', [ @@ -302,9 +331,12 @@ ConfirmSendEther.prototype.render = function () { h('section.flex-row.flex-center.confirm-screen-row', [ h('span.confirm-screen-label.confirm-screen-section-column', [ 'Gas Fee' ]), h('div.confirm-screen-section-column', [ - h('div.confirm-screen-row-info', `${gasFeeInFIAT} ${currentCurrency.toUpperCase()}`), - - h('div.confirm-screen-row-detail', `${gasFeeInETH} ETH`), + h(GasFeeDisplay, { + gasTotal: gasTotal || gasFeeInHex, + conversionRate, + convertedCurrency, + onClick: () => showCustomizeGasModal(txMeta, sendGasLimit, sendGasPrice, gasTotal), + }), ]), ]), diff --git a/ui/app/components/send/gas-fee-display-v2.js b/ui/app/components/send/gas-fee-display-v2.js index 0c4c3f7a9..da1bdd05e 100644 --- a/ui/app/components/send/gas-fee-display-v2.js +++ b/ui/app/components/send/gas-fee-display-v2.js @@ -32,11 +32,11 @@ GasFeeDisplay.prototype.render = function () { }) : h('div.currency-display', 'Loading...'), - h('button.send-v2__sliders-icon-container', { + h('button.sliders-icon-container', { onClick, disabled: !gasTotal, }, [ - h('i.fa.fa-sliders.send-v2__sliders-icon'), + h('i.fa.fa-sliders.sliders-icon'), ]), ]) diff --git a/ui/app/css/itcss/components/send.scss b/ui/app/css/itcss/components/send.scss index bb17e53cd..1a058b305 100644 --- a/ui/app/css/itcss/components/send.scss +++ b/ui/app/css/itcss/components/send.scss @@ -660,6 +660,7 @@ &__gas-fee-display { width: 100%; + position: relative; } &__sliders-icon-container { @@ -885,3 +886,23 @@ } } } + +.sliders-icon-container { + display: flex; + align-items: center; + justify-content: center; + height: 24px; + width: 24px; + border: 1px solid $curious-blue; + border-radius: 4px; + background-color: $white; + position: absolute; + right: 15px; + top: 14px; + cursor: pointer; + font-size: 1em; +} + +.sliders-icon { + color: $curious-blue; +} \ No newline at end of file -- cgit From c1ff927fa0e129a828d3345b21723300d5e73ef1 Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 9 Mar 2018 10:00:37 -0330 Subject: Lint fixes. --- ui/app/actions.js | 2 +- ui/app/components/pending-tx/confirm-send-ether.js | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/ui/app/actions.js b/ui/app/actions.js index 200946753..d6f509590 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -1271,7 +1271,7 @@ function retryTransaction (txId) { return dispatch(actions.displayWarning(err.message)) } const { selectedAddressTxList } = newState - const { id: newTxId } = selectedAddressTxList[selectedAddressTxList.length - 1] + const { id: newTxId } = selectedAddressTxList[selectedAddressTxList.length - 1] dispatch(actions.updateMetamaskState(newState)) dispatch(actions.viewPendingTx(newTxId)) }) diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index 422b1c6c1..ec61d66b4 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -233,8 +233,6 @@ ConfirmSendEther.prototype.render = function () { name: toName, }, memo, - gasFeeInFIAT, - gasFeeInETH, gasFeeInHex, amountInFIAT, totalInFIAT, -- cgit From f805a2eb735ea2ae93e91df0d35c6856987fa734 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 02:31:35 -0230 Subject: Fix gas calculation and nonce / forceGasMin state setting errors; retry button shows on correct tx. --- ui/app/components/customize-gas-modal/index.js | 6 +-- ui/app/components/pending-tx/confirm-send-ether.js | 52 +++++++++++++--------- ui/app/components/tx-list-item.js | 6 ++- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/ui/app/components/customize-gas-modal/index.js b/ui/app/components/customize-gas-modal/index.js index 34a93d6c6..2bac57253 100644 --- a/ui/app/components/customize-gas-modal/index.js +++ b/ui/app/components/customize-gas-modal/index.js @@ -117,9 +117,9 @@ CustomizeGasModal.prototype.save = function (gasPrice, gasLimit, gasTotal) { updateSendAmount(maxAmount) } - updateGasPrice(gasPrice) - updateGasLimit(gasLimit) - updateGasTotal(gasTotal) + updateGasPrice(ethUtil.addHexPrefix(gasPrice)) + updateGasLimit(ethUtil.addHexPrefix(gasLimit)) + updateGasTotal(ethUtil.addHexPrefix(gasTotal)) hideModal() } diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index ec61d66b4..b1e3a0374 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -8,7 +8,11 @@ const Identicon = require('../identicon') const ethUtil = require('ethereumjs-util') const BN = ethUtil.BN const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') -const { conversionUtil, addCurrencies } = require('../../conversion-util') +const { + conversionUtil, + addCurrencies, + multiplyCurrencies +} = require('../../conversion-util') const GasFeeDisplay = require('../send/gas-fee-display-v2') const { MIN_GAS_PRICE_HEX } = require('../send/send-constants') @@ -37,7 +41,7 @@ function mapDispatchToProps (dispatch) { return { clearSend: () => dispatch(actions.clearSend()), editTransaction: txMeta => { - const { id, txParams, lastGasPrice } = txMeta + const { id, txParams } = txMeta const { gas: gasLimit, gasPrice, @@ -45,21 +49,6 @@ function mapDispatchToProps (dispatch) { value: amount, } = txParams - let forceGasMin - let nonce - if (lastGasPrice) { - const stripped = ethUtil.stripHexPrefix(lastGasPrice) - forceGasMin = ethUtil.addHexPrefix(addCurrencies(stripped, MIN_GAS_PRICE_HEX, { - aBase: 16, - bBase: 16, - toNumericBase: 'hex', - fromDenomination: 'WEI', - toDenomination: 'GWEI', - })) - - nonce = txParams.nonce - } - dispatch(actions.updateSend({ gasLimit, gasPrice, @@ -68,21 +57,36 @@ function mapDispatchToProps (dispatch) { amount, errors: { to: null, amount: null }, editingTransactionId: id, - forceGasMin, - nonce, })) dispatch(actions.showSendPage()) }, cancelTransaction: ({ id }) => dispatch(actions.cancelTx({ id })), showCustomizeGasModal: (txMeta, sendGasLimit, sendGasPrice, sendGasTotal) => { - const { id, txParams } = txMeta + const { id, txParams, lastGasPrice } = txMeta const { gas: txGasLimit, gasPrice: txGasPrice } = txParams + let forceGasMin + let nonce + if (lastGasPrice) { + const stripped = ethUtil.stripHexPrefix(lastGasPrice) + forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(stripped, 1.1, { + multiplicandBase: 16, + multiplierBase: 10, + toNumericBase: 'hex', + fromDenomination: 'WEI', + toDenomination: 'GWEI', + })) + + nonce = txParams.nonce + } + dispatch(actions.updateSend({ gasLimit: sendGasLimit || txGasLimit, gasPrice: sendGasPrice || txGasPrice, editingTransactionId: id, gasTotal: sendGasTotal, + forceGasMin, + nonce, })) dispatch(actions.showModal({ name: 'CUSTOMIZE_GAS' })) }, @@ -493,6 +497,14 @@ ConfirmSendEther.prototype.gatherTxMeta = function () { const state = this.state const txData = clone(state.txData) || clone(props.txData) + if (txData.lastGasPrice) { + const { gasPrice: sendGasPrice, gas: sendGasLimit } = props.send + const { gasPrice: txGasPrice, gas: txGasLimit } = txData.txParams + + txData.txParams.gasPrice = sendGasPrice || txGasPrice + txData.txParams.gas = sendGasLimit || txGasLimit + } + // log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) return txData } diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index 123f723be..f7d53709f 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -185,9 +185,11 @@ TxListItem.prototype.showRetryButton = function () { } = this.props const currentNonce = txParams.nonce const currentNonceTxs = selectedAddressTxList.filter(tx => tx.txParams.nonce === currentNonce) - const isLastWithNonce = currentNonceTxs[currentNonceTxs.length - 1].id === transactionId + const currentStatusNonceTx = currentNonceTxs.filter(tx => + tx.status !== 'rejected' && tx.status !== 'failed') + const isLastPassingWithNonce = currentStatusNonceTx[currentStatusNonceTx.length - 1].id === transactionId - return transactionStatus === 'submitted' && isLastWithNonce && Date.now() - transactionTime > 5000 + return transactionStatus === 'submitted' && isLastPassingWithNonce && Date.now() - transactionTime > 30000 } TxListItem.prototype.resubmit = function () { -- cgit From e6d1ce56e7b792957f7b5c3249ecf013752b87ed Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 03:11:45 -0230 Subject: Improve phrasing of copy. --- ui/app/components/pending-tx/confirm-send-ether.js | 2 +- ui/app/components/tx-list-item.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index b1e3a0374..8788a77f8 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -243,7 +243,7 @@ ConfirmSendEther.prototype.render = function () { totalInETH, } = this.getData() - const title = txMeta.lastGasPrice ? 'Overwrite Transaction' : 'Confirm' + const title = txMeta.lastGasPrice ? 'Reprice Transaction' : 'Confirm' const subtitle = txMeta.lastGasPrice ? 'Increase your gas fee to attempt to overwrite and speed up your transaction' : 'Please review your transaction.' diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index f7d53709f..62426252f 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -280,7 +280,7 @@ TxListItem.prototype.render = function () { event.stopPropagation() this.resubmit() }, - }, 'Increase the gas on your transaction'), + }, 'Increase the gas price on your transaction'), ]), -- cgit From 179066fe6ba3eca002454981c5ef56df7bb142ab Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 03:26:37 -0230 Subject: Set txMeta.time to reflect time of tx approval. --- ui/app/components/pending-tx/confirm-send-ether.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index 8788a77f8..899c2617c 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -457,7 +457,7 @@ ConfirmSendEther.prototype.render = function () { ConfirmSendEther.prototype.onSubmit = function (event) { event.preventDefault() - const txMeta = this.gatherTxMeta() + const txMeta = this.gatherTxMeta({ time: (new Date()).getTime() }) const valid = this.checkValidity() this.setState({ valid, submitting: true }) @@ -492,7 +492,7 @@ ConfirmSendEther.prototype.getFormEl = function () { } // After a customizable state value has been updated, -ConfirmSendEther.prototype.gatherTxMeta = function () { +ConfirmSendEther.prototype.gatherTxMeta = function (opts) { const props = this.props const state = this.state const txData = clone(state.txData) || clone(props.txData) @@ -506,7 +506,7 @@ ConfirmSendEther.prototype.gatherTxMeta = function () { } // log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) - return txData + return Object.assign(txData, opts) } ConfirmSendEther.prototype.verifyGasParams = function () { -- cgit From 9fd349d7407d7c33deb317942f7e2835585767c9 Mon Sep 17 00:00:00 2001 From: frankiebee Date: Tue, 13 Mar 2018 09:51:37 -0700 Subject: transactions:state - add a submittedTime stamp so the ui has a better grasp of the time of submission --- app/scripts/lib/tx-state-manager.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/scripts/lib/tx-state-manager.js b/app/scripts/lib/tx-state-manager.js index e75f733aa..ad07c813f 100644 --- a/app/scripts/lib/tx-state-manager.js +++ b/app/scripts/lib/tx-state-manager.js @@ -214,7 +214,11 @@ module.exports = class TransactionStateManager extends EventEmitter { } // should update the status of the tx to 'submitted'. + // and add a time stamp for when it was called setTxStatusSubmitted (txId) { + const txMeta = this.getTx(txId) + txMeta.submittedTime = (new Date()).getTime() + this.updateTx(txMeta, 'txStateManager - add submitted time stamp') this._setTxStatus(txId, 'submitted') } -- cgit From c33eeb0d3e3e6a8179066b6feaed6788e7392930 Mon Sep 17 00:00:00 2001 From: Orange Date: Wed, 14 Mar 2018 03:21:31 +0800 Subject: update update --- app/_locales/zh_CN/messages.json | 605 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 602 insertions(+), 3 deletions(-) diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index fc87384e5..03981bc37 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1,10 +1,609 @@ { + "accept": { + "message": "接收" + }, + "account": { + "message": "账户" + }, + "accountDetails": { + "message": "账户详情" + }, + "accountName": { + "message": "账户名称" + }, + "address": { + "message": "地址" + }, + "addToken": { + "message": "添加代币" + }, + "amount": { + "message": "数量" + }, + "amountPlusGas": { + "message": "数量 + Gas" + }, + "appDescription": { + "message": "以太坊浏览器插件", + "description": "The description of the application" + }, "appName": { "message": "MetaMask", "description": "The name of the application" }, - "appDescription": { - "message": "以太坊身份管理", - "description": "The description of the application" + "attemptingConnect": { + "message": "正在尝试连接区块链." + }, + "available": { + "message": "可用" + }, + "back": { + "message": "返回" + }, + "balance": { + "message": "余额:" + }, + "balanceIsInsufficientGas": { + "message": "当前余额不足支付Gas" + }, + "beta": { + "message": "测试版" + }, + "betweenMinAndMax": { + "message": "必须大于等于1美元并且小于等于2美元。", + "description": "helper for inputting hex as decimal input" + }, + "borrowDharma": { + "message": "Borrow With Dharma (Beta)" + }, + "buy": { + "message": "购买" + }, + "buyCoinbase": { + "message": "在Coinbase上购买" + }, + "buyCoinbaseExplainer": { + "message": "Coinbase是世界上最流行的买卖比特币,以太币和litecoin的方式。" + }, + "cancel": { + "message": "取消" + }, + "clickCopy": { + "message": "点击复制" + }, + "confirm": { + "message": "确认" + }, + "confirmContract": { + "message": "确认合约" + }, + "confirmPassword": { + "message": "确认密码" + }, + "confirmTransaction": { + "message": "确认交易" + }, + "continueToCoinbase": { + "message": "继续访问Coinbase" + }, + "contractDeployment": { + "message": "合约部署" + }, + "conversionProgress": { + "message": "正在进行转换" + }, + "copiedButton": { + "message": "已复制" + }, + "copiedClipboard": { + "message": "已复制到粘贴板" + }, + "copiedExclamation": { + "message": "已复制!" + }, + "copy": { + "message": "复制" + }, + "copyToClipboard": { + "message": "复制到粘贴板" + }, + "copyButton": { + "message": " 复制 " + }, + "copyPrivateKey": { + "message": "这是你的私钥 (点击复制)" + }, + "create": { + "message": "创建" + }, + "createAccount": { + "message": "创建账户" + }, + "createDen": { + "message": "创建" + }, + "crypto": { + "message": "加密", + "description": "Exchange type (cryptocurrencies)" + }, + "customGas": { + "message": "自定义 Gas" + }, + "customize": { + "message": "自定义" + }, + "customRPC": { + "message": "自定义 RPC" + }, + "defaultNetwork": { + "message": "默认ETH转账网络为 Main Net." + }, + "denExplainer": { + "message": "Your DEN is your password-encrypted storage within MetaMask." + }, + "deposit": { + "message": "存款" + }, + "depositBTC": { + "message": "Deposit your BTC to the address below:" + }, + "depositCoin": { + "message": "Deposit your $1 to the address below", + "description": "Tells the user what coin they have selected to deposit with shapeshift" + }, + "depositEth": { + "message": "存入 Eth" + }, + "depositEther": { + "message": "存入 Ether" + }, + "depositFiat": { + "message": "Deposit with Fiat" + }, + "depositFromAccount": { + "message": "从其他账户存入" + }, + "depositShapeShift": { + "message": "从ShapeShift存入" + }, + "depositShapeShiftExplainer": { + "message": "If you own other cryptocurrencies, you can trade and deposit Ether directly into your MetaMask wallet. No Account Needed." + }, + "details": { + "message": "详情" + }, + "directDeposit": { + "message": "直接存入" + }, + "directDepositEther": { + "message": "直接存入 Ether" + }, + "directDepositEtherExplainer": { + "message": "If you already have some Ether, the quickest way to get Ether in your new wallet by direct deposit." + }, + "done": { + "message": "完成" + }, + "edit": { + "message": "编辑" + }, + "editAccountName": { + "message": "编辑账户名称" + }, + "encryptNewDen": { + "message": "Encrypt your new DEN" + }, + "enterPassword": { + "message": "请输入密码" + }, + "etherscanView": { + "message": "View account on Etherscan" + }, + "exchangeRate": { + "message": "Exchange Rate" + }, + "exportPrivateKey": { + "message": "导出私钥" + }, + "exportPrivateKeyWarning": { + "message": "导出私钥需要您自担风险" + }, + "failed": { + "message": "失败" + }, + "fiat": { + "message": "FIAT", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "文件导入失败? 点击这里!", + "description": "Helps user import their account from a JSON file" + }, + "from": { + "message": "来自" + }, + "fromShapeShift": { + "message": "来自 ShapeShift" + }, + "gas": { + "message": "Gas", + "description": "Short indication of gas cost" + }, + "gasFee": { + "message": "Gas Fee" + }, + "gasLimit": { + "message": "Gas Limit" + }, + "gasLimitCalculation": { + "message": "We calculate the suggested gas limit based on network success rates." + }, + "gasLimitRequired": { + "message": "Gas Limit Required" + }, + "gasLimitTooLow": { + "message": "Gas limit must be at least 21000" + }, + "gasPrice": { + "message": "Gas Price (GWEI)" + }, + "gasPriceCalculation": { + "message": "We calculate the suggested gas prices based on network success rates." + }, + "gasPriceRequired": { + "message": "Gas Price Required" + }, + "getEther": { + "message": "获取 Ether" + }, + "getEtherFromFaucet": { + "message": "Get Ether from a faucet for the $1", + "description": "Displays network name for Ether faucet" + }, + "greaterThanMin": { + "message": "must be greater than or equal to $1.", + "description": "helper for inputting hex as decimal input" + }, + "here": { + "message": "这里", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hide": { + "message": "隐藏" + }, + "hideToken": { + "message": "Hide Token" + }, + "hideTokenPrompt": { + "message": "Hide Token?" + }, + "howToDeposit": { + "message": "How would you like to deposit Ether?" + }, + "import": { + "message": "Import", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Import Account" + }, + "importAnAccount": { + "message": "Import an account" + }, + "importDen": { + "message": "Import Existing DEN" + }, + "imported": { + "message": "Imported", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "infoHelp": { + "message": "Info & Help" + }, + "invalidAddress": { + "message": "Invalid address" + }, + "invalidGasParams": { + "message": "Invalid Gas Parameters" + }, + "invalidInput": { + "message": "Invalid input." + }, + "invalidRequest": { + "message": "Invalid Request" + }, + "jsonFile": { + "message": "JSON File", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan Test Network" + }, + "lessThanMax": { + "message": "must be less than or equal to $1.", + "description": "helper for inputting hex as decimal input" + }, + "limit": { + "message": "Limit" + }, + "loading": { + "message": "Loading..." + }, + "loadingTokens": { + "message": "Loading Tokens..." + }, + "localhost": { + "message": "Localhost 8545" + }, + "logout": { + "message": "登出" + }, + "loose": { + "message": "Loose" + }, + "mainnet": { + "message": "以太坊正式网络" + }, + "message": { + "message": "信息" + }, + "min": { + "message": "Minimum" + }, + "myAccounts": { + "message": "My Accounts" + }, + "needEtherInWallet": { + "message": "To interact with decentralized applications using MetaMask, you’ll need Ether in your wallet." + }, + "needImportFile": { + "message": "You must select a file to import.", + "description": "User is important an account and needs to add a file to continue" + }, + "needImportPassword": { + "message": "You must enter a password for the selected file.", + "description": "Password and file needed to import an account" + }, + "networks": { + "message": "Networks" + }, + "newAccount": { + "message": "New Account" + }, + "newAccountNumberName": { + "message": "Account $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContract": { + "message": "New Contract" + }, + "newPassword": { + "message": "New Password (min 8 chars)" + }, + "newRecipient": { + "message": "New Recipient" + }, + "next": { + "message": "Next" + }, + "noAddressForName": { + "message": "No address has been set for this name." + }, + "noDeposits": { + "message": "No deposits received" + }, + "noTransactionHistory": { + "message": "No transaction history." + }, + "noTransactions": { + "message": "No Transactions" + }, + "notStarted": { + "message": "Not Started" + }, + "oldUI": { + "message": "Old UI" + }, + "oldUIMessage": { + "message": "You have returned to the old UI. You can switch back to the New UI through the option in the top right dropdown menu." + }, + "or": { + "message": "or", + "description": "choice between creating or importing a new account" + }, + "passwordMismatch": { + "message": "passwords don't match", + "description": "in password creation process, the two new password fields did not match" + }, + "passwordShort": { + "message": "密码不够长", + "description": "in password creation process, the password is not long enough to be secure" + }, + "pastePrivateKey": { + "message": "请粘贴您的私钥:", + "description": "For importing an account from a private key" + }, + "pasteSeed": { + "message": "请粘贴您的助记词!" + }, + "pleaseReviewTransaction": { + "message": "Please review your transaction." + }, + "privateKey": { + "message": "Private Key", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Warning: Never disclose this key. Anyone with your private keys can take steal any assets held in your account." + }, + "privateNetwork": { + "message": "Private Network" + }, + "qrCode": { + "message": "Show QR Code" + }, + "readdToken": { + "message": "You can add this token back in the future by going go to “Add token” in your accounts options menu." + }, + "readMore": { + "message": "Read more here." + }, + "receive": { + "message": "Receive" + }, + "recipientAddress": { + "message": "Recipient Address" + }, + "refundAddress": { + "message": "Your Refund Address" + }, + "rejected": { + "message": "Rejected" + }, + "required": { + "message": "Required" + }, + "retryWithMoreGas": { + "message": "Retry with a higher gas price here" + }, + "revert": { + "message": "Revert" + }, + "rinkeby": { + "message": "Rinkeby 测试网络" + }, + "ropsten": { + "message": "Ropsten 测试网络" + }, + "sampleAccountName": { + "message": "例如. 我的账户", + "description": "Help user understand concept of adding a human-readable name to their account" + }, + "save": { + "message": "Save" + }, + "saveAsFile": { + "message": "Save as File", + "description": "Account export process" + }, + "selectService": { + "message": "Select Service" + }, + "send": { + "message": "Send" + }, + "sendTokens": { + "message": "Send Tokens" + }, + "sendTokensAnywhere": { + "message": "Send Tokens to anyone with an Ethereum account" + }, + "settings": { + "message": "Settings" + }, + "shapeshiftBuy": { + "message": "Buy with Shapeshift" + }, + "showPrivateKeys": { + "message": "Show Private Keys" + }, + "showQRCode": { + "message": "Show QR Code" + }, + "sign": { + "message": "Sign" + }, + "signMessage": { + "message": "Sign Message" + }, + "signNotice": { + "message": "Signing this message can have \ndangerous side effects. Only sign messages from \nsites you fully trust with your entire account.\n This dangerous method will be removed in a future version. " + }, + "sigRequest": { + "message": "Signature Request" + }, + "sigRequested": { + "message": "Signature Requested" + }, + "status": { + "message": "状态" + }, + "submit": { + "message": "提交" + }, + "takesTooLong": { + "message": "花费太长时间?" + }, + "testFaucet": { + "message": "Test Faucet" + }, + "to": { + "message": "To" + }, + "toETHviaShapeShift": { + "message": "$1 to ETH via ShapeShift", + "description": "system will fill in deposit type in start of message" + }, + "tokenBalance": { + "message": "Your Token Balance is:" + }, + "total": { + "message": "总量" + }, + "transactionMemo": { + "message": "Transaction memo (optional)" + }, + "transactionNumber": { + "message": "Transaction Number" + }, + "transfers": { + "message": "Transfers" + }, + "troubleTokenBalances": { + "message": "We had trouble loading your token balances. You can view them ", + "description": "Followed by a link (here) to view token balances" + }, + "typePassword": { + "message": "请输入密码" + }, + "uiWelcome": { + "message": "Welcome to the New UI (Beta)" + }, + "uiWelcomeMessage": { + "message": "You are now using the new Metamask UI. Take a look around, try out new features like sending tokens, and let us know if you have any issues." + }, + "unavailable": { + "message": "Unavailable" + }, + "unknown": { + "message": "未知" + }, + "unknownNetwork": { + "message": "未知私有网络" + }, + "unknownNetworkId": { + "message": "未知网络ID" + }, + "usaOnly": { + "message": "USA only", + "description": "Using this exchange is limited to people inside the USA" + }, + "usedByClients": { + "message": "Used by a variety of different clients" + }, + "viewAccount": { + "message": "View Account" + }, + "warning": { + "message": "警告" + }, + "whatsThis": { + "message": "这是什么?" + }, + "yourSigRequested": { + "message": "Your signature is being requested" + }, + "youSign": { + "message": "You are signing" } } -- cgit From c6dff98ee1551c4ae69c14c52073d64ace15f773 Mon Sep 17 00:00:00 2001 From: frankiebee Date: Tue, 13 Mar 2018 14:30:59 -0700 Subject: tests - add tests for transactions#retryTransaction and transactions#_markNonceDuplicatesDropped --- test/unit/tx-controller-test.js | 45 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/test/unit/tx-controller-test.js b/test/unit/tx-controller-test.js index cc99afee4..712097fce 100644 --- a/test/unit/tx-controller-test.js +++ b/test/unit/tx-controller-test.js @@ -392,6 +392,49 @@ describe('Transaction Controller', function () { }) }) + describe('#retryTransaction', function () { + it('should create a new txMeta with the same txParams as the original one', function (done) { + let txParams = { + nonce: '0x00', + from: '0xB09d8505E1F4EF1CeA089D47094f5DD3464083d4', + to: '0xB09d8505E1F4EF1CeA089D47094f5DD3464083d4', + data: '0x0', + } + txController.txStateManager._saveTxList([ + { id: 1, status: 'submitted', metamaskNetworkId: currentNetworkId, txParams }, + ]) + txController.retryTransaction(1) + .then((txMeta) => { + assert.equal(txMeta.txParams.nonce, txParams.nonce, 'nonce should be the same') + assert.equal(txMeta.txParams.from, txParams.from, 'from should be the same') + assert.equal(txMeta.txParams.to, txParams.to, 'to should be the same') + assert.equal(txMeta.txParams.data, txParams.data, 'data should be the same') + assert.ok(('lastGasPrice' in txMeta), 'should have the key `lastGasPrice`') + assert.equal(txController.txStateManager.getTxList().length, 2) + done() + }).catch(done) + }) + }) + + describe('#_markNonceDuplicatesDropped', function () { + it('should mark all nonce duplicates as dropped without marking the confirmed transaction as dropped', function () { + txController.txStateManager._saveTxList([ + { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, history: [{}], txParams: { nonce: '0x01' } }, + { id: 2, status: 'submitted', metamaskNetworkId: currentNetworkId, history: [{}], txParams: { nonce: '0x01' } }, + { id: 3, status: 'submitted', metamaskNetworkId: currentNetworkId, history: [{}], txParams: { nonce: '0x01' } }, + { id: 4, status: 'submitted', metamaskNetworkId: currentNetworkId, history: [{}], txParams: { nonce: '0x01' } }, + { id: 5, status: 'submitted', metamaskNetworkId: currentNetworkId, history: [{}], txParams: { nonce: '0x01' } }, + { id: 6, status: 'submitted', metamaskNetworkId: currentNetworkId, history: [{}], txParams: { nonce: '0x01' } }, + { id: 7, status: 'submitted', metamaskNetworkId: currentNetworkId, history: [{}], txParams: { nonce: '0x01' } }, + ]) + txController._markNonceDuplicatesDropped(1) + const confirmedTx = txController.txStateManager.getTx(1) + const droppedTxs = txController.txStateManager.getFilteredTxList({ nonce: '0x01', status: 'dropped' }) + assert.equal(confirmedTx.status, 'confirmed', 'the confirmedTx should remain confirmed') + assert.equal(droppedTxs.length, 6, 'their should be 6 dropped txs') + + }) + }) describe('#getPendingTransactions', function () { beforeEach(function () { @@ -401,7 +444,7 @@ describe('Transaction Controller', function () { { id: 3, status: 'approved', metamaskNetworkId: currentNetworkId, txParams: {} }, { id: 4, status: 'signed', metamaskNetworkId: currentNetworkId, txParams: {} }, { id: 5, status: 'submitted', metamaskNetworkId: currentNetworkId, txParams: {} }, - { id: 6, status: 'confimed', metamaskNetworkId: currentNetworkId, txParams: {} }, + { id: 6, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }, { id: 7, status: 'failed', metamaskNetworkId: currentNetworkId, txParams: {} }, ]) }) -- cgit From 9d7640996aa9b63fb6c9271d7e0698e7acdc559e Mon Sep 17 00:00:00 2001 From: frankiebee Date: Tue, 13 Mar 2018 14:42:26 -0700 Subject: transactions - return the txMeta in retryTransaction --- app/scripts/controllers/transactions.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/scripts/controllers/transactions.js b/app/scripts/controllers/transactions.js index a3f731b6e..ab07dde62 100644 --- a/app/scripts/controllers/transactions.js +++ b/app/scripts/controllers/transactions.js @@ -3,7 +3,7 @@ const ObservableStore = require('obs-store') const ethUtil = require('ethereumjs-util') const Transaction = require('ethereumjs-tx') const EthQuery = require('ethjs-query') -const TransactionStateManager = require('../lib/tx-state-manager') +const TransactionStateManger = require('../lib/tx-state-manager') const TxGasUtil = require('../lib/tx-gas-utils') const PendingTransactionTracker = require('../lib/pending-tx-tracker') const NonceTracker = require('../lib/nonce-tracker') @@ -37,7 +37,7 @@ module.exports = class TransactionController extends EventEmitter { this.query = new EthQuery(this.provider) this.txGasUtil = new TxGasUtil(this.provider) - this.txStateManager = new TransactionStateManager({ + this.txStateManager = new TransactionStateManger({ initState: opts.initState, txHistoryLimit: opts.txHistoryLimit, getNetwork: this.getNetwork.bind(this), @@ -227,6 +227,7 @@ module.exports = class TransactionController extends EventEmitter { }) this.addTx(txMeta) this.emit('newUnapprovedTx', txMeta) + return txMeta } async updateTransaction (txMeta) { -- cgit From d6e4d2e80d05f64bb543e524c6288b8b7c33e4c1 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 21:09:04 -0230 Subject: Use new submittedTime field to correctly show retry button in old and new ui. --- old-ui/app/components/transaction-list-item.js | 12 +++++++++--- old-ui/app/components/transaction-list.js | 2 +- ui/app/components/pending-tx/confirm-send-ether.js | 2 +- ui/app/components/tx-list-item.js | 10 +++++----- ui/app/components/tx-list.js | 6 +++--- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js index e7251df8d..b9da171ba 100644 --- a/old-ui/app/components/transaction-list-item.js +++ b/old-ui/app/components/transaction-list-item.js @@ -29,9 +29,15 @@ function TransactionListItem () { } TransactionListItem.prototype.showRetryButton = function () { - const { transaction = {} } = this.props - const { status, time } = transaction - return status === 'submitted' && Date.now() - time > 30000 + const { transaction = {}, transactions } = this.props + const { status, submittedTime, txParams } = transaction + const currentNonce = txParams.nonce + const currentNonceTxs = transactions.filter(tx => tx.txParams.nonce === currentNonce) + const currentNonceSubmittedTxs = currentNonceTxs.filter(tx => tx.status === 'submitted') + const isLastSubmittedTxWithCurrentNonce = + currentNonceSubmittedTxs[currentNonceSubmittedTxs.length - 1].id === transaction.id + + return isLastSubmittedTxWithCurrentNonce && Date.now() - submittedTime > 30000 } TransactionListItem.prototype.render = function () { diff --git a/old-ui/app/components/transaction-list.js b/old-ui/app/components/transaction-list.js index 345e3ca16..c77852921 100644 --- a/old-ui/app/components/transaction-list.js +++ b/old-ui/app/components/transaction-list.js @@ -62,7 +62,7 @@ TransactionList.prototype.render = function () { } return h(TransactionListItem, { transaction, i, network, key, - conversionRate, + conversionRate, transactions, showTx: (txId) => { this.props.viewPendingTx(txId) }, diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index 899c2617c..8fe58482b 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -11,7 +11,7 @@ const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') const { conversionUtil, addCurrencies, - multiplyCurrencies + multiplyCurrencies, } = require('../../conversion-util') const GasFeeDisplay = require('../send/gas-fee-display-v2') diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index 62426252f..941fcb69c 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -178,18 +178,18 @@ TxListItem.prototype.getSendTokenTotal = async function () { TxListItem.prototype.showRetryButton = function () { const { transactionStatus, - transactionTime, + transactionSubmittedTime, selectedAddressTxList, transactionId, txParams, } = this.props const currentNonce = txParams.nonce const currentNonceTxs = selectedAddressTxList.filter(tx => tx.txParams.nonce === currentNonce) - const currentStatusNonceTx = currentNonceTxs.filter(tx => - tx.status !== 'rejected' && tx.status !== 'failed') - const isLastPassingWithNonce = currentStatusNonceTx[currentStatusNonceTx.length - 1].id === transactionId + const currentNonceSubmittedTxs = currentNonceTxs.filter(tx => transactionStatus === 'submitted') + const isLastSubmittedTxWithCurrentNonce = + currentNonceSubmittedTxs[currentNonceSubmittedTxs.length - 1].id === transactionId - return transactionStatus === 'submitted' && isLastPassingWithNonce && Date.now() - transactionTime > 30000 + return isLastSubmittedTxWithCurrentNonce && Date.now() - transactionSubmittedTime > 30000 } TxListItem.prototype.resubmit = function () { diff --git a/ui/app/components/tx-list.js b/ui/app/components/tx-list.js index 30f816d58..add70a266 100644 --- a/ui/app/components/tx-list.js +++ b/ui/app/components/tx-list.js @@ -77,7 +77,7 @@ TxList.prototype.renderTransactionListItem = function (transaction, conversionRa transactionId: transaction.id, transactionHash: transaction.hash, transactionNetworkId: transaction.metamaskNetworkId, - transactionTime: transaction.time, + transactionSubmittedTime: transaction.transactionSubmittedTime, } const { @@ -88,7 +88,7 @@ TxList.prototype.renderTransactionListItem = function (transaction, conversionRa transactionId, transactionHash, transactionNetworkId, - transactionTime, + transactionSubmittedTime, } = props const { showConfTxPage } = this.props @@ -103,7 +103,7 @@ TxList.prototype.renderTransactionListItem = function (transaction, conversionRa transactionHash, conversionRate, tokenInfoGetter: this.tokenInfoGetter, - transactionTime, + transactionSubmittedTime, } const isUnapproved = transactionStatus === 'unapproved' -- cgit From e293b6349c522171db26c57e718c5213aa6d5cb3 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 21:11:50 -0230 Subject: Styling for dropped. --- ui/app/components/tx-list-item.js | 1 + ui/app/css/itcss/components/transaction-list.scss | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index 941fcb69c..d2fc57b13 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -253,6 +253,7 @@ TxListItem.prototype.render = function () { className: classnames('tx-list-status', { 'tx-list-status--rejected': transactionStatus === 'rejected', 'tx-list-status--failed': transactionStatus === 'failed', + 'tx-list-status--dropped': transactionStatus === 'dropped', }), }, transactionStatus, diff --git a/ui/app/css/itcss/components/transaction-list.scss b/ui/app/css/itcss/components/transaction-list.scss index 4545897e3..df7d80e2e 100644 --- a/ui/app/css/itcss/components/transaction-list.scss +++ b/ui/app/css/itcss/components/transaction-list.scss @@ -236,6 +236,10 @@ .tx-list-status--failed { color: $monzo; } + + .tx-list-status--dropped { + opacity: 0.5; + } } .tx-list-item { -- cgit From 8c7988978f05fa57bba892efb42ae0036ce25771 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 21:32:22 -0230 Subject: Undefined check in showRetryButton --- old-ui/app/components/transaction-list-item.js | 7 ++++--- ui/app/components/tx-list-item.js | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js index b9da171ba..3881d8c1c 100644 --- a/old-ui/app/components/transaction-list-item.js +++ b/old-ui/app/components/transaction-list-item.js @@ -34,10 +34,11 @@ TransactionListItem.prototype.showRetryButton = function () { const currentNonce = txParams.nonce const currentNonceTxs = transactions.filter(tx => tx.txParams.nonce === currentNonce) const currentNonceSubmittedTxs = currentNonceTxs.filter(tx => tx.status === 'submitted') - const isLastSubmittedTxWithCurrentNonce = - currentNonceSubmittedTxs[currentNonceSubmittedTxs.length - 1].id === transaction.id + const lastSubmittedTxWithCurrentNonce = currentNonceSubmittedTxs[currentNonceSubmittedTxs.length - 1] + const currentTxIsLatestWithNonce = lastSubmittedTxWithCurrentNonce + && lastSubmittedTxWithCurrentNonce.id === transaction.id - return isLastSubmittedTxWithCurrentNonce && Date.now() - submittedTime > 30000 + return currentTxIsLatestWithNonce && Date.now() - submittedTime > 30000 } TransactionListItem.prototype.render = function () { diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index d2fc57b13..453f7e95c 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -186,10 +186,11 @@ TxListItem.prototype.showRetryButton = function () { const currentNonce = txParams.nonce const currentNonceTxs = selectedAddressTxList.filter(tx => tx.txParams.nonce === currentNonce) const currentNonceSubmittedTxs = currentNonceTxs.filter(tx => transactionStatus === 'submitted') - const isLastSubmittedTxWithCurrentNonce = - currentNonceSubmittedTxs[currentNonceSubmittedTxs.length - 1].id === transactionId + const lastSubmittedTxWithCurrentNonce = currentNonceSubmittedTxs[currentNonceSubmittedTxs.length - 1] + const currentTxIsLatestWithNonce = lastSubmittedTxWithCurrentNonce + && lastSubmittedTxWithCurrentNonce.id === transactionId - return isLastSubmittedTxWithCurrentNonce && Date.now() - transactionSubmittedTime > 30000 + return currentTxIsLatestWithNonce && Date.now() - submittedTime > 30000 } TxListItem.prototype.resubmit = function () { -- cgit From 46ded45b8186c0b338f6cff811cd89c48ef1a5ab Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 21:38:08 -0230 Subject: Use correct var name in new-ui showRetryButton --- ui/app/components/tx-list-item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index 453f7e95c..ebf5db19f 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -190,7 +190,7 @@ TxListItem.prototype.showRetryButton = function () { const currentTxIsLatestWithNonce = lastSubmittedTxWithCurrentNonce && lastSubmittedTxWithCurrentNonce.id === transactionId - return currentTxIsLatestWithNonce && Date.now() - submittedTime > 30000 + return currentTxIsLatestWithNonce && Date.now() - transactionSubmittedTime > 30000 } TxListItem.prototype.resubmit = function () { -- cgit From c52253bb0eb8ab1c7c7e9c0e7002d5ada42d53d6 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 21:57:23 -0230 Subject: Use correct name for submittedTime field in tx-list.js --- ui/app/components/tx-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/app/components/tx-list.js b/ui/app/components/tx-list.js index add70a266..782de0266 100644 --- a/ui/app/components/tx-list.js +++ b/ui/app/components/tx-list.js @@ -77,7 +77,7 @@ TxList.prototype.renderTransactionListItem = function (transaction, conversionRa transactionId: transaction.id, transactionHash: transaction.hash, transactionNetworkId: transaction.metamaskNetworkId, - transactionSubmittedTime: transaction.transactionSubmittedTime, + transactionSubmittedTime: transaction.submittedTime, } const { -- cgit From 80a2e59194d3c5e5dc5fa098a5c022ae5dc30848 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 22:08:27 -0230 Subject: Correctly set latest submitted retry with nonces that matches others in old-ui transaction-list-item. --- old-ui/app/components/transaction-list-item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js index 3881d8c1c..61db8b350 100644 --- a/old-ui/app/components/transaction-list-item.js +++ b/old-ui/app/components/transaction-list-item.js @@ -34,7 +34,7 @@ TransactionListItem.prototype.showRetryButton = function () { const currentNonce = txParams.nonce const currentNonceTxs = transactions.filter(tx => tx.txParams.nonce === currentNonce) const currentNonceSubmittedTxs = currentNonceTxs.filter(tx => tx.status === 'submitted') - const lastSubmittedTxWithCurrentNonce = currentNonceSubmittedTxs[currentNonceSubmittedTxs.length - 1] + const lastSubmittedTxWithCurrentNonce = currentNonceSubmittedTxs[0] const currentTxIsLatestWithNonce = lastSubmittedTxWithCurrentNonce && lastSubmittedTxWithCurrentNonce.id === transaction.id -- cgit From bf3c5add08baf905a4fd723fdc2b5c59342cc597 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 22:17:08 -0230 Subject: Adds styles for dropped txs in old-ui. --- old-ui/app/components/transaction-list-item.js | 5 +++++ old-ui/app/css/index.css | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js index 61db8b350..7ab3414e5 100644 --- a/old-ui/app/components/transaction-list-item.js +++ b/old-ui/app/components/transaction-list-item.js @@ -208,6 +208,11 @@ function formatDate (date) { function renderErrorOrWarning (transaction) { const { status, err, warning } = transaction + // show dropped + if (status === 'dropped') { + return h('span.dropped', ' (Dropped)') + } + // show rejected if (status === 'rejected') { return h('span.error', ' (Rejected)') diff --git a/old-ui/app/css/index.css b/old-ui/app/css/index.css index 67c327f62..7af713336 100644 --- a/old-ui/app/css/index.css +++ b/old-ui/app/css/index.css @@ -247,6 +247,10 @@ app sections color: #FFAE00; } +.dropped { + color: #6195ED; +} + .lock { width: 50px; height: 50px; -- cgit From 0d33aed20e3f3eea68e7d0cb41fbfb0d80415000 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 23:29:47 -0230 Subject: Fix tx-list-item submitted check. --- ui/app/components/tx-list-item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index ebf5db19f..b7f7c5ab4 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -185,7 +185,7 @@ TxListItem.prototype.showRetryButton = function () { } = this.props const currentNonce = txParams.nonce const currentNonceTxs = selectedAddressTxList.filter(tx => tx.txParams.nonce === currentNonce) - const currentNonceSubmittedTxs = currentNonceTxs.filter(tx => transactionStatus === 'submitted') + const currentNonceSubmittedTxs = currentNonceTxs.filter(tx => tx.status === 'submitted') const lastSubmittedTxWithCurrentNonce = currentNonceSubmittedTxs[currentNonceSubmittedTxs.length - 1] const currentTxIsLatestWithNonce = lastSubmittedTxWithCurrentNonce && lastSubmittedTxWithCurrentNonce.id === transactionId -- cgit From e94a14ef8aee8a80a4d21ed8cb1d5b680296eb0b Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 23:44:05 -0230 Subject: Make token confirmations compatible. --- ui/app/components/pending-tx/confirm-send-token.js | 85 +++++++++++++++++++--- ui/app/components/tx-list-item.js | 17 ++++- 2 files changed, 88 insertions(+), 14 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-token.js b/ui/app/components/pending-tx/confirm-send-token.js index e4b0c186a..4ce6a7bc3 100644 --- a/ui/app/components/pending-tx/confirm-send-token.js +++ b/ui/app/components/pending-tx/confirm-send-token.js @@ -8,6 +8,7 @@ abiDecoder.addABI(tokenAbi) const actions = require('../../actions') const clone = require('clone') const Identicon = require('../identicon') +const GasFeeDisplay = require('../send/gas-fee-display-v2.js') const ethUtil = require('ethereumjs-util') const BN = ethUtil.BN const { @@ -88,6 +89,42 @@ function mapDispatchToProps (dispatch, ownProps) { })) dispatch(actions.showSendTokenPage()) }, + showCustomizeGasModal: (txMeta, sendGasLimit, sendGasPrice, sendGasTotal) => { + const { id, txParams, lastGasPrice } = txMeta + const { gas: txGasLimit, gasPrice: txGasPrice } = txParams + const tokenData = txParams.data && abiDecoder.decodeMethod(txParams.data) + const { params = [] } = tokenData + const { value: to } = params[0] || {} + const { value: tokenAmountInDec } = params[1] || {} + const tokenAmountInHex = conversionUtil(tokenAmountInDec, { + fromNumericBase: 'dec', + toNumericBase: 'hex', + }) + + let forceGasMin + let nonce + if (lastGasPrice) { + const stripped = ethUtil.stripHexPrefix(lastGasPrice) + forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(stripped, 1.1, { + multiplicandBase: 16, + multiplierBase: 10, + toNumericBase: 'hex', + fromDenomination: 'WEI', + toDenomination: 'GWEI', + })) + } + + dispatch(actions.updateSend({ + gasLimit: sendGasLimit || txGasLimit, + gasPrice: sendGasPrice || txGasPrice, + editingTransactionId: id, + gasTotal: sendGasTotal, + to, + amount: tokenAmountInHex, + forceGasMin, + })) + dispatch(actions.showModal({ name: 'CUSTOMIZE_GAS' })) + }, } } @@ -187,6 +224,7 @@ ConfirmSendToken.prototype.getGasFee = function () { token: tokenExchangeRate ? tokenGas : null, + gasFeeInHex: gasTotal.toString(16), } } @@ -239,19 +277,31 @@ ConfirmSendToken.prototype.renderHeroAmount = function () { } ConfirmSendToken.prototype.renderGasFee = function () { - const { token: { symbol }, currentCurrency } = this.props - const { fiat: fiatGas, token: tokenGas, eth: ethGas } = this.getGasFee() + const { + token: { symbol }, + currentCurrency: convertedCurrency, + conversionRate, + send: { gasTotal, gasLimit: sendGasLimit, gasPrice: sendGasPrice }, + showCustomizeGasModal, + } = this.props + const txMeta = this.gatherTxMeta() + const { + fiat: fiatGas, + token: tokenGas, + eth: ethGas, + gasFeeInHex + } = this.getGasFee() return ( h('section.flex-row.flex-center.confirm-screen-row', [ h('span.confirm-screen-label.confirm-screen-section-column', [ 'Gas Fee' ]), h('div.confirm-screen-section-column', [ - h('div.confirm-screen-row-info', `${fiatGas} ${currentCurrency}`), - - h( - 'div.confirm-screen-row-detail', - tokenGas ? `${tokenGas} ${symbol}` : `${ethGas} ETH` - ), + h(GasFeeDisplay, { + gasTotal: gasTotal || gasFeeInHex, + conversionRate, + convertedCurrency, + onClick: () => showCustomizeGasModal(txMeta, sendGasLimit, sendGasPrice, gasTotal), + }), ]), ]) ) @@ -307,16 +357,21 @@ ConfirmSendToken.prototype.render = function () { this.inputs = [] + const title = txMeta.lastGasPrice ? 'Reprice Transaction' : 'Confirm' + const subtitle = txMeta.lastGasPrice + ? 'Increase your gas fee to attempt to overwrite and speed up your transaction' + : 'Please review your transaction.' + return ( h('div.confirm-screen-container.confirm-send-token', [ // Main Send token Card h('div.page-container', [ h('div.page-container__header', [ - h('button.confirm-screen-back-button', { + !txMeta.lastGasPrice && h('button.confirm-screen-back-button', { onClick: () => editTransaction(txMeta), }, 'Edit'), - h('div.page-container__title', 'Confirm'), - h('div.page-container__subtitle', `Please review your transaction.`), + h('div.page-container__title', title), + h('div.page-container__subtitle', subtitle), ]), h('div.flex-row.flex-center.confirm-screen-identicons', [ h('div.confirm-screen-account-wrapper', [ @@ -438,6 +493,14 @@ ConfirmSendToken.prototype.gatherTxMeta = function () { const state = this.state const txData = clone(state.txData) || clone(props.txData) + if (txData.lastGasPrice) { + const { gasPrice: sendGasPrice, gas: sendGasLimit } = props.send + const { gasPrice: txGasPrice, gas: txGasLimit } = txData.txParams + + txData.txParams.gasPrice = sendGasPrice || txGasPrice + txData.txParams.gas = sendGasLimit || txGasLimit + } + // log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) return txData } diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index b7f7c5ab4..0b826e909 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -28,6 +28,7 @@ function mapStateToProps (state) { function mapDispatchToProps (dispatch) { return { + setSelectedToken: tokenAddress => dispatch(actions.setSelectedToken(tokenAddress)), retryTransaction: transactionId => dispatch(actions.retryTransaction(transactionId)), } } @@ -39,6 +40,7 @@ function TxListItem () { this.state = { total: null, fiatTotal: null, + isTokenTx: null, } } @@ -47,12 +49,13 @@ TxListItem.prototype.componentDidMount = async function () { const decodedData = txParams.data && abiDecoder.decodeMethod(txParams.data) const { name: txDataName } = decodedData || {} + const isTokenTx = txDataName === 'transfer' - const { total, fiatTotal } = txDataName === 'transfer' + const { total, fiatTotal } = isTokenTx ? await this.getSendTokenTotal() : this.getSendEtherTotal() - this.setState({ total, fiatTotal }) + this.setState({ total, fiatTotal, isTokenTx }) } TxListItem.prototype.getAddressText = function () { @@ -193,6 +196,10 @@ TxListItem.prototype.showRetryButton = function () { return currentTxIsLatestWithNonce && Date.now() - transactionSubmittedTime > 30000 } +TxListItem.prototype.setSelectedToken = function (tokenAddress) { + this.props.setSelectedToken(tokenAddress) +} + TxListItem.prototype.resubmit = function () { const { transactionId } = this.props this.props.retryTransaction(transactionId) @@ -207,8 +214,9 @@ TxListItem.prototype.render = function () { dateString, address, className, + txParams, } = this.props - const { total, fiatTotal } = this.state + const { total, fiatTotal, isTokenTx } = this.state const showFiatTotal = transactionAmount !== '0x0' && fiatTotal return h(`div${className || ''}`, { @@ -280,6 +288,9 @@ TxListItem.prototype.render = function () { h('span.tx-list-item-retry-link', { onClick: (event) => { event.stopPropagation() + if (isTokenTx) { + this.setSelectedToken(txParams.to) + } this.resubmit() }, }, 'Increase the gas price on your transaction'), -- cgit From c37684d7bde00adcb4b2e43db16be91978e2ef12 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 23:49:10 -0230 Subject: Remove unnecessary addition of nonce to state. --- ui/app/components/pending-tx/confirm-send-ether.js | 3 --- ui/app/reducers/metamask.js | 2 -- ui/app/send-v2.js | 5 ----- 3 files changed, 10 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index 8fe58482b..f3f7e86c5 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -76,8 +76,6 @@ function mapDispatchToProps (dispatch) { fromDenomination: 'WEI', toDenomination: 'GWEI', })) - - nonce = txParams.nonce } dispatch(actions.updateSend({ @@ -86,7 +84,6 @@ function mapDispatchToProps (dispatch) { editingTransactionId: id, gasTotal: sendGasTotal, forceGasMin, - nonce, })) dispatch(actions.showModal({ name: 'CUSTOMIZE_GAS' })) }, diff --git a/ui/app/reducers/metamask.js b/ui/app/reducers/metamask.js index b27e7140a..2c93172cc 100644 --- a/ui/app/reducers/metamask.js +++ b/ui/app/reducers/metamask.js @@ -39,7 +39,6 @@ function reduceMetamask (state, action) { maxModeOn: false, editingTransactionId: null, forceGasMin: null, - nonce: null, }, coinOptions: {}, useBlockie: false, @@ -299,7 +298,6 @@ function reduceMetamask (state, action) { errors: {}, editingTransactionId: null, forceGasMin: null, - nonce: null, }, }) diff --git a/ui/app/send-v2.js b/ui/app/send-v2.js index 697dfc517..fc1df1f51 100644 --- a/ui/app/send-v2.js +++ b/ui/app/send-v2.js @@ -548,7 +548,6 @@ SendTransactionScreen.prototype.getEditedTx = function () { selectedToken, editingTransactionId, unapprovedTxs, - nonce, } = this.props const editingTx = { @@ -560,10 +559,6 @@ SendTransactionScreen.prototype.getEditedTx = function () { }, } - if (nonce) { - editingTx.txParams.nonce = ethUtil.addHexPrefix(nonce) - } - if (selectedToken) { const data = TOKEN_TRANSFER_FUNCTION_SIGNATURE + Array.prototype.map.call( ethAbi.rawEncode(['address', 'uint256'], [to, ethUtil.addHexPrefix(amount)]), -- cgit From cc267d6c818c83b0384b569733d05efef384ac3e Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 13 Mar 2018 23:56:45 -0230 Subject: Fix more lint errors. --- ui/app/components/pending-tx/confirm-send-ether.js | 1 - ui/app/components/pending-tx/confirm-send-token.js | 9 +-------- ui/app/components/tx-list-item.js | 3 +-- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index f3f7e86c5..4666e047d 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -66,7 +66,6 @@ function mapDispatchToProps (dispatch) { const { gas: txGasLimit, gasPrice: txGasPrice } = txParams let forceGasMin - let nonce if (lastGasPrice) { const stripped = ethUtil.stripHexPrefix(lastGasPrice) forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(stripped, 1.1, { diff --git a/ui/app/components/pending-tx/confirm-send-token.js b/ui/app/components/pending-tx/confirm-send-token.js index 4ce6a7bc3..476c1d259 100644 --- a/ui/app/components/pending-tx/confirm-send-token.js +++ b/ui/app/components/pending-tx/confirm-send-token.js @@ -102,7 +102,6 @@ function mapDispatchToProps (dispatch, ownProps) { }) let forceGasMin - let nonce if (lastGasPrice) { const stripped = ethUtil.stripHexPrefix(lastGasPrice) forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(stripped, 1.1, { @@ -278,19 +277,13 @@ ConfirmSendToken.prototype.renderHeroAmount = function () { ConfirmSendToken.prototype.renderGasFee = function () { const { - token: { symbol }, currentCurrency: convertedCurrency, conversionRate, send: { gasTotal, gasLimit: sendGasLimit, gasPrice: sendGasPrice }, showCustomizeGasModal, } = this.props const txMeta = this.gatherTxMeta() - const { - fiat: fiatGas, - token: tokenGas, - eth: ethGas, - gasFeeInHex - } = this.getGasFee() + const { gasFeeInHex } = this.getGasFee() return ( h('section.flex-row.flex-center.confirm-screen-row', [ diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js index 0b826e909..4c2b77af9 100644 --- a/ui/app/components/tx-list-item.js +++ b/ui/app/components/tx-list-item.js @@ -55,7 +55,7 @@ TxListItem.prototype.componentDidMount = async function () { ? await this.getSendTokenTotal() : this.getSendEtherTotal() - this.setState({ total, fiatTotal, isTokenTx }) + this.setState({ total, fiatTotal, isTokenTx }) } TxListItem.prototype.getAddressText = function () { @@ -180,7 +180,6 @@ TxListItem.prototype.getSendTokenTotal = async function () { TxListItem.prototype.showRetryButton = function () { const { - transactionStatus, transactionSubmittedTime, selectedAddressTxList, transactionId, -- cgit From 5fa8e83b3cf204e154507adf594a4bbb1fa7eee3 Mon Sep 17 00:00:00 2001 From: Orange Date: Wed, 14 Mar 2018 11:13:52 +0800 Subject: fix fix --- app/_locales/zh_CN/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 03981bc37..1d72f0e0f 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -50,7 +50,7 @@ "message": "测试版" }, "betweenMinAndMax": { - "message": "必须大于等于1美元并且小于等于2美元。", + "message": "必须大于等于 $1 并且小于等于 $2 。", "description": "helper for inputting hex as decimal input" }, "borrowDharma": { -- cgit From 8299ab438a3f2ea1106c21b37dbc5c561b62e023 Mon Sep 17 00:00:00 2001 From: Mami Mordovets Date: Wed, 14 Mar 2018 14:33:26 +0900 Subject: Translation to Japanese --- app/_locales/ja/messages.json | 605 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 602 insertions(+), 3 deletions(-) diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index f15d06ff4..bab8d3b95 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1,10 +1,609 @@ { + "accept": { + "message": "承認" + }, + "account": { + "message": "アカウント" + }, + "accountDetails": { + "message": "アカウント詳細" + }, + "accountName": { + "message": "アカウント名" + }, + "address": { + "message": "アドレス" + }, + "addToken": { + "message": "トークンを追加" + }, + "amount": { + "message": "金額" + }, + "amountPlusGas": { + "message": "金額 + ガス" + }, + "appDescription": { + "message": "Ethereumのブラウザ・エクステンション", + "description": "The description of the application" + }, "appName": { "message": "MetaMask", "description": "The name of the application" }, - "appDescription": { - "message": "EthereumのID管理", - "description": "The description of the application" + "attemptingConnect": { + "message": "ブロックチェーンに接続中" + }, + "available": { + "message": "有効" + }, + "back": { + "message": "戻る" + }, + "balance": { + "message": "残高:" + }, + "balanceIsInsufficientGas": { + "message": "現在のガス総量に対して残高が不足しています" + }, + "beta": { + "message": "ベータ版" + }, + "betweenMinAndMax": { + "message": " $1以上 $2以下にして下さい。", + "description": "helper for inputting hex as decimal input" + }, + "borrowDharma": { + "message": "Dharmaで借りる(ベータ版)" + }, + "buy": { + "message": "購入" + }, + "buyCoinbase": { + "message": "Coinbaseで購入" + }, + "buyCoinbaseExplainer": { + "message": "Coinbaseは、世界で最もポピュラーなBitcoin、Ethereum、そしてLitecoinの取引所です。" + }, + "cancel": { + "message": "キャンセル" + }, + "clickCopy": { + "message": "クリックしてコピー" + }, + "confirm": { + "message": "確認" + }, + "confirmContract": { + "message": "コントラクトの確認" + }, + "confirmPassword": { + "message": "パスワードの確認" + }, + "confirmTransaction": { + "message": "トランザクションの確認" + }, + "continueToCoinbase": { + "message": "Coinbaseで続行" + }, + "contractDeployment": { + "message": "コントラクトのデプロイ" + }, + "conversionProgress": { + "message": "変換中" + }, + "copiedButton": { + "message": "コピー完了" + }, + "copiedClipboard": { + "message": "クリップボードへコピー済み" + }, + "copiedExclamation": { + "message": "コピー完了!" + }, + "copy": { + "message": "コピー" + }, + "copyToClipboard": { + "message": "クリップボードへコピー" + }, + "copyButton": { + "message": " コピー " + }, + "copyPrivateKey": { + "message": "これはあなたの秘密鍵です(クリックでコピー)" + }, + "create": { + "message": "作成" + }, + "createAccount": { + "message": "アカウント作成" + }, + "createDen": { + "message": "作成" + }, + "crypto": { + "message": "暗号通貨", + "description": "Exchange type (cryptocurrencies)" + }, + "customGas": { + "message": "ガスのカスタマイズ" + }, + "customize": { + "message": "カスタマイズ" + }, + "customRPC": { + "message": "カスタムRPC" + }, + "defaultNetwork": { + "message": "Etherトランザクションのデフォルトのネットワークはメインネットです。" + }, + "denExplainer": { + "message": "DENとは、あなたのパスワードが暗号化されたMetaMask内のストレージです。" + }, + "deposit": { + "message": "デポジット" + }, + "depositBTC": { + "message": "あなたのBTCを次のアドレスへデポジット:" + }, + "depositCoin": { + "message": "あなたの $1を次のアドレスへデポジット", + "description": "Tells the user what coin they have selected to deposit with shapeshift" + }, + "depositEth": { + "message": "ETHをデポジット" + }, + "depositEther": { + "message": "Etherをデポジット" + }, + "depositFiat": { + "message": "法定通貨でデポジット" + }, + "depositFromAccount": { + "message": "別のアカウントからデポジット" + }, + "depositShapeShift": { + "message": "ShapeShiftでデポジット" + }, + "depositShapeShiftExplainer": { + "message": "あなたが他の暗号通貨を持っているなら、Etherにトレードしてダイレクトにメタマスクウォレットへのデポジットが可能です。アカウント作成は不要。" + }, + "details": { + "message": "詳細" + }, + "directDeposit": { + "message": "ダイレクトデポジット" + }, + "directDepositEther": { + "message": "Etherをダイレクトデポジット" + }, + "directDepositEtherExplainer": { + "message": "あなたがEtherをすでにお持ちなら、ダイレクトデポジットは新しいウォレットにEtherを入手する最も迅速な方法です。" + }, + "done": { + "message": "完了" + }, + "edit": { + "message": "編集" + }, + "editAccountName": { + "message": "アカウント名を編集" + }, + "encryptNewDen": { + "message": "新しいDENを暗号化する" + }, + "enterPassword": { + "message": "パスワードを入力" + }, + "etherscanView": { + "message": "Etherscanでアカウントを見る" + }, + "exchangeRate": { + "message": "交換レート" + }, + "exportPrivateKey": { + "message": "秘密鍵のエクスポート" + }, + "exportPrivateKeyWarning": { + "message": "あなた自身の責任で秘密鍵をエクスポート" + }, + "failed": { + "message": "失敗" + }, + "fiat": { + "message": "法定通貨", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "ファイルがインポートされなければ、ここをクリック!", + "description": "Helps user import their account from a JSON file" + }, + "from": { + "message": "送信元" + }, + "fromShapeShift": { + "message": "ShapeShiftから" + }, + "gas": { + "message": "ガス", + "description": "Short indication of gas cost" + }, + "gasFee": { + "message": "ガス料金" + }, + "gasLimit": { + "message": "ガスリミット" + }, + "gasLimitCalculation": { + "message": "ネットワークの成功率を基にして、ガスリミットを提案しています。" + }, + "gasLimitRequired": { + "message": "必要ガスリミット" + }, + "gasLimitTooLow": { + "message": "ガスリミットは最低21000です。" + }, + "gasPrice": { + "message": "ガスプライス (GWEI)" + }, + "gasPriceCalculation": { + "message": "ネットワークの成功率を基にして、ガスプライスを提案しています。" + }, + "gasPriceRequired": { + "message": "必要ガスプライス" + }, + "getEther": { + "message": "Etherをゲット" + }, + "getEtherFromFaucet": { + "message": "フォーセットで $1のEtherをゲット", + "description": "Displays network name for Ether faucet" + }, + "greaterThanMin": { + "message": " $1以上にして下さい。", + "description": "helper for inputting hex as decimal input" + }, + "here": { + "message": "ここ", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hide": { + "message": "隠す" + }, + "hideToken": { + "message": "トークンを隠す" + }, + "hideTokenPrompt": { + "message": "トークンを隠しますか??" + }, + "howToDeposit": { + "message": "どのようにEtherをデポジットしますか?" + }, + "import": { + "message": "インポート", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "アカウントのインポート" + }, + "importAnAccount": { + "message": "アカウントをインポート" + }, + "importDen": { + "message": "既存のDENをインポート" + }, + "imported": { + "message": "インポート完了", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "infoHelp": { + "message": "インフォメーションとヘルプ" + }, + "invalidAddress": { + "message": "アドレスが無効です。" + }, + "invalidGasParams": { + "message": "ガスのパラメーターが無効です。" + }, + "invalidInput": { + "message": "インプットが無効です。" + }, + "invalidRequest": { + "message": "リクエストが無効です。" + }, + "jsonFile": { + "message": "JSONファイル", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovanテストネットワーク" + }, + "lessThanMax": { + "message": " $1以下にして下さい。", + "description": "helper for inputting hex as decimal input" + }, + "limit": { + "message": "リミット" + }, + "loading": { + "message": "ロード中..." + }, + "loadingTokens": { + "message": "トークンをロード中..." + }, + "localhost": { + "message": "Localhost 8545" + }, + "logout": { + "message": "ログアウト" + }, + "loose": { + "message": "外部秘密鍵" + }, + "mainnet": { + "message": "Ethereumメインネットワーク" + }, + "message": { + "message": "メッセージ" + }, + "min": { + "message": "ミニマム" + }, + "myAccounts": { + "message": "マイアカウント" + }, + "needEtherInWallet": { + "message": "MetaMaskを使って分散型アプリケーションと対話するためには、あなたのウォレットにEtherが必要になります。" + }, + "needImportFile": { + "message": "インポートするファイルを選択してください。", + "description": "User is important an account and needs to add a file to continue" + }, + "needImportPassword": { + "message": "選択したファイルのパスワードを入力してください。", + "description": "Password and file needed to import an account" + }, + "networks": { + "message": "ネットワーク" + }, + "newAccount": { + "message": "新規アカウント" + }, + "newAccountNumberName": { + "message": "アカウント $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContract": { + "message": "新規コントラクト" + }, + "newPassword": { + "message": "新規パスワード(最低8文字)" + }, + "newRecipient": { + "message": "新規受取人" + }, + "next": { + "message": "次へ" + }, + "noAddressForName": { + "message": "この名前にはアドレスが設定されていません。" + }, + "noDeposits": { + "message": "デポジットがありません。" + }, + "noTransactionHistory": { + "message": "トランザクション履歴がありません。" + }, + "noTransactions": { + "message": "トランザクションがありません。" + }, + "notStarted": { + "message": "スタートしていません。" + }, + "oldUI": { + "message": "旧UI" + }, + "oldUIMessage": { + "message": "旧UIを表示しています。右上のドロップダウンメニューのオプションより、新UIへ切り替えが可能です。" + }, + "or": { + "message": "または", + "description": "choice between creating or importing a new account" + }, + "passwordMismatch": { + "message": "パスワードが一致しません。", + "description": "in password creation process, the two new password fields did not match" + }, + "passwordShort": { + "message": "パスワードが短すぎます。", + "description": "in password creation process, the password is not long enough to be secure" + }, + "pastePrivateKey": { + "message": "秘密鍵をここにペーストして下さい:", + "description": "For importing an account from a private key" + }, + "pasteSeed": { + "message": "シードをここにペーストして下さい!" + }, + "pleaseReviewTransaction": { + "message": "トランザクションをレビューして下さい。" + }, + "privateKey": { + "message": "秘密鍵", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "警告: この鍵は絶対に公開しないで下さい。公開すると、誰でもあなたのアカウント内の資産を盗むことができてしまいます。" + }, + "privateNetwork": { + "message": "プライベート・ネットワーク" + }, + "qrCode": { + "message": "QRコードを表示" + }, + "readdToken": { + "message": "アカウントのオプションメニューから「トークンを追加」すれば、将来このトークンを追加し直すことができます。" + }, + "readMore": { + "message": "もっと読む" + }, + "receive": { + "message": "受け取る" + }, + "recipientAddress": { + "message": "受取人アドレス" + }, + "refundAddress": { + "message": "あなたの返金先アドレス" + }, + "rejected": { + "message": "拒否されました" + }, + "required": { + "message": "必要です。" + }, + "retryWithMoreGas": { + "message": "より高いガスプライスで再度試して下さい。" + }, + "revert": { + "message": "元に戻す" + }, + "rinkeby": { + "message": "Rinkebyテストネットワーク" + }, + "ropsten": { + "message": "Ropstenテストネットワーク" + }, + "sampleAccountName": { + "message": "例.新しいマイアカウント", + "description": "Help user understand concept of adding a human-readable name to their account" + }, + "save": { + "message": "保存" + }, + "saveAsFile": { + "message": "ファイルとして保存", + "description": "Account export process" + }, + "selectService": { + "message": "サービスを選択" + }, + "send": { + "message": "送信" + }, + "sendTokens": { + "message": "トークンを送る" + }, + "sendTokensAnywhere": { + "message": "イーサリアムのアカウントを持っている人にトークンを送る" + }, + "settings": { + "message": "設定" + }, + "shapeshiftBuy": { + "message": "Shapeshiftで買う" + }, + "showPrivateKeys": { + "message": "秘密鍵を表示" + }, + "showQRCode": { + "message": "QRコードを表示" + }, + "sign": { + "message": "署名" + }, + "signMessage": { + "message": "メッセージに署名" + }, + "signNotice": { + "message": "このメッセージへの署名は危険となる可能性があります。\n完全に信頼するサイトからのメッセージのみ、\nあなたのアカウントで署名して下さい。今後のバージョンでは、\nこの危険なメソッドは削除される予定です。" + }, + "sigRequest": { + "message": "署名リクエスト" + }, + "sigRequested": { + "message": "署名がリクエストされました" + }, + "status": { + "message": "ステータス" + }, + "submit": { + "message": "送信" + }, + "takesTooLong": { + "message": "長くかかりすぎていますか?" + }, + "testFaucet": { + "message": "Faucetをテスト" + }, + "to": { + "message": "宛先" + }, + "toETHviaShapeShift": { + "message": "ShapeShiftで $1をETHにする", + "description": "system will fill in deposit type in start of message" + }, + "tokenBalance": { + "message": "あなたのトークン残高:" + }, + "total": { + "message": "合計" + }, + "transactionMemo": { + "message": "トランザクションメモ (オプション)" + }, + "transactionNumber": { + "message": "トランザクション番号" + }, + "transfers": { + "message": "トランスファー" + }, + "troubleTokenBalances": { + "message": "トークン残高を取得できません。こちらでご確認ください。", + "description": "Followed by a link (here) to view token balances" + }, + "typePassword": { + "message": "パスワードタイプ" + }, + "uiWelcome": { + "message": "新UIへようこそ!(ベータ版)" + }, + "uiWelcomeMessage": { + "message": "現在Metamaskの新しいUIをお使いになっています。トークン送信など、新たな機能を試してみましょう!何か問題があればご報告ください。" + }, + "unavailable": { + "message": "有効ではありません。" + }, + "unknown": { + "message": "不明" + }, + "unknownNetwork": { + "message": "不明なプライベートネットワーク" + }, + "unknownNetworkId": { + "message": "不明なネットワークID" + }, + "usaOnly": { + "message": "米国居住者のみ", + "description": "Using this exchange is limited to people inside the USA" + }, + "usedByClients": { + "message": "様々なクライアントによって使用されています。" + }, + "viewAccount": { + "message": "アカウントを見る" + }, + "warning": { + "message": "警告" + }, + "whatsThis": { + "message": "これは何でしょう?" + }, + "yourSigRequested": { + "message": "あなたの署名がリクエストされています。" + }, + "youSign": { + "message": "署名しています。" } } -- cgit From fd5bdb3241c7dde53b8ab541316ed1c5bfff3667 Mon Sep 17 00:00:00 2001 From: Orange Date: Wed, 14 Mar 2018 15:15:56 +0800 Subject: fix fix --- app/_locales/zh_CN/messages.json | 60 ++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 1d72f0e0f..e8a7ba19a 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -281,11 +281,11 @@ "message": "How would you like to deposit Ether?" }, "import": { - "message": "Import", + "message": "导入", "description": "Button to import an account from a selected file" }, "importAccount": { - "message": "Import Account" + "message": "导入账户" }, "importAnAccount": { "message": "Import an account" @@ -301,7 +301,7 @@ "message": "Info & Help" }, "invalidAddress": { - "message": "Invalid address" + "message": "错误地址" }, "invalidGasParams": { "message": "Invalid Gas Parameters" @@ -313,24 +313,24 @@ "message": "Invalid Request" }, "jsonFile": { - "message": "JSON File", + "message": "JSON 文件", "description": "format for importing an account" }, "kovan": { - "message": "Kovan Test Network" + "message": "Kovan 测试网络" }, "lessThanMax": { - "message": "must be less than or equal to $1.", + "message": "必须小于等于 $1.", "description": "helper for inputting hex as decimal input" }, "limit": { "message": "Limit" }, "loading": { - "message": "Loading..." + "message": "加载..." }, "loadingTokens": { - "message": "Loading Tokens..." + "message": "加载代币..." }, "localhost": { "message": "Localhost 8545" @@ -348,16 +348,16 @@ "message": "信息" }, "min": { - "message": "Minimum" + "message": "最小" }, "myAccounts": { - "message": "My Accounts" + "message": "我的账户" }, "needEtherInWallet": { "message": "To interact with decentralized applications using MetaMask, you’ll need Ether in your wallet." }, "needImportFile": { - "message": "You must select a file to import.", + "message": "你必须选择导入一个文件.", "description": "User is important an account and needs to add a file to continue" }, "needImportPassword": { @@ -365,20 +365,20 @@ "description": "Password and file needed to import an account" }, "networks": { - "message": "Networks" + "message": "网络" }, "newAccount": { - "message": "New Account" + "message": "新账户" }, "newAccountNumberName": { - "message": "Account $1", + "message": "账户 $1", "description": "Default name of next account to be created on create account screen" }, "newContract": { - "message": "New Contract" + "message": "新合约" }, "newPassword": { - "message": "New Password (min 8 chars)" + "message": "新密码(至少8个字符)" }, "newRecipient": { "message": "New Recipient" @@ -402,17 +402,17 @@ "message": "Not Started" }, "oldUI": { - "message": "Old UI" + "message": "旧 UI" }, "oldUIMessage": { "message": "You have returned to the old UI. You can switch back to the New UI through the option in the top right dropdown menu." }, "or": { - "message": "or", + "message": "或", "description": "choice between creating or importing a new account" }, "passwordMismatch": { - "message": "passwords don't match", + "message": "密码不匹配", "description": "in password creation process, the two new password fields did not match" }, "passwordShort": { @@ -430,17 +430,17 @@ "message": "Please review your transaction." }, "privateKey": { - "message": "Private Key", + "message": "私钥", "description": "select this type of file to use to import an account" }, "privateKeyWarning": { "message": "Warning: Never disclose this key. Anyone with your private keys can take steal any assets held in your account." }, "privateNetwork": { - "message": "Private Network" + "message": "私有网络" }, "qrCode": { - "message": "Show QR Code" + "message": "显示二维码" }, "readdToken": { "message": "You can add this token back in the future by going go to “Add token” in your accounts options menu." @@ -449,7 +449,7 @@ "message": "Read more here." }, "receive": { - "message": "Receive" + "message": "接收" }, "recipientAddress": { "message": "Recipient Address" @@ -458,7 +458,7 @@ "message": "Your Refund Address" }, "rejected": { - "message": "Rejected" + "message": "拒绝" }, "required": { "message": "Required" @@ -480,20 +480,20 @@ "description": "Help user understand concept of adding a human-readable name to their account" }, "save": { - "message": "Save" + "message": "保存" }, "saveAsFile": { - "message": "Save as File", + "message": "保存文件", "description": "Account export process" }, "selectService": { "message": "Select Service" }, "send": { - "message": "Send" + "message": "发送" }, "sendTokens": { - "message": "Send Tokens" + "message": "发送 Tokens" }, "sendTokensAnywhere": { "message": "Send Tokens to anyone with an Ethereum account" @@ -505,10 +505,10 @@ "message": "Buy with Shapeshift" }, "showPrivateKeys": { - "message": "Show Private Keys" + "message": "显示私钥" }, "showQRCode": { - "message": "Show QR Code" + "message": "显示二维码" }, "sign": { "message": "Sign" -- cgit From 2d3763d70927dd1aefbc19f9ab6d463a713f2576 Mon Sep 17 00:00:00 2001 From: Lazaridis Date: Sat, 10 Mar 2018 04:56:39 +0200 Subject: add READMEs to folders, re #3427 --- .gitignore | 2 ++ README.md | 1 + app/scripts/README.md | 14 ++++++++++++++ app/scripts/controllers/README.md | 4 ++++ app/scripts/migrations/README.md | 5 +++++ development/README.md | 5 +++++ docs/README.md | 13 +++++++++++++ notices/README.md | 5 +++++ 8 files changed, 49 insertions(+) create mode 100644 app/scripts/README.md create mode 100644 app/scripts/controllers/README.md create mode 100644 app/scripts/migrations/README.md create mode 100644 development/README.md create mode 100644 docs/README.md create mode 100644 notices/README.md diff --git a/.gitignore b/.gitignore index 5f2d2f551..059315545 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,9 @@ app/bower_components test/bower_components package +# IDEs .idea +.vscode temp .tmp diff --git a/README.md b/README.md index d45b73778..278357c23 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ To write tests that will be run in the browser using QUnit, add your test files - [How to add custom build to Chrome](./docs/add-to-chrome.md) - [How to add custom build to Firefox](./docs/add-to-firefox.md) - [How to develop a live-reloading UI](./docs/ui-dev-mode.md) +- [How to add a new translation to MetaMask](./docs/translating-guide.md) - [Publishing Guide](./docs/publishing.md) - [How to develop an in-browser mocked UI](./docs/ui-mock-mode.md) - [How to live reload on local dependency changes](./docs/developing-on-deps.md) diff --git a/app/scripts/README.md b/app/scripts/README.md new file mode 100644 index 000000000..f5a907244 --- /dev/null +++ b/app/scripts/README.md @@ -0,0 +1,14 @@ +# Main MetaMask Code + +This folder contains the core-code. + +Currently, it is organized mostly based on file category, like: + +controllers, migrations, lib + +## Ongoing Task + +Refactor code-structure, thus the subsystems are reflected on the filesystem. + +### Examples + diff --git a/app/scripts/controllers/README.md b/app/scripts/controllers/README.md new file mode 100644 index 000000000..392c0457d --- /dev/null +++ b/app/scripts/controllers/README.md @@ -0,0 +1,4 @@ +# Controllers + +Different controllers (in the sense of *VC *View-Controller). + diff --git a/app/scripts/migrations/README.md b/app/scripts/migrations/README.md new file mode 100644 index 000000000..3a67b08e1 --- /dev/null +++ b/app/scripts/migrations/README.md @@ -0,0 +1,5 @@ +# Migrations + +Data (user data, config files etc.) is migrated from one version to another. + +Migrations are called by {} from {} during {}. \ No newline at end of file diff --git a/development/README.md b/development/README.md new file mode 100644 index 000000000..1e18d4f16 --- /dev/null +++ b/development/README.md @@ -0,0 +1,5 @@ +# Development + +Several files which are needed for developing on(!) MetaMask. + +Usually each files contains information about its scope / usage. \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..0739cfa46 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,13 @@ +# Documentation + + +- [How to add custom build to Chrome](./add-to-chrome.md) +- [How to add custom build to Firefox](./add-to-firefox.md) +- [How to develop a live-reloading UI](./ui-dev-mode.md) +- [Publishing Guide](./publishing.md) +- [How to develop an in-browser mocked UI](./ui-mock-mode.md) +- [How to live reload on local dependency changes](./developing-on-deps.md) +- [How to add new networks to the Provider Menu](./adding-new-networks.md) +- [How to manage notices that appear when the app starts up](./notices.md) +- [How to port MetaMask to a new platform](./porting_to_new_environment.md) +- [How to generate a visualization of this repository's development](./development-visualization.md) \ No newline at end of file diff --git a/notices/README.md b/notices/README.md new file mode 100644 index 000000000..9362769c2 --- /dev/null +++ b/notices/README.md @@ -0,0 +1,5 @@ +# Notices + +Those notices are of legal nature. They are displayed to the users of MetaMask. + +Any changes or additions must be reviewed by the product management. \ No newline at end of file -- cgit From 106ce091a9ef9fbd37b90c49bc76f12bd796ebb5 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 14 Mar 2018 11:45:04 -0230 Subject: Fix TransactionStateManager spelling. --- app/scripts/controllers/transactions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/scripts/controllers/transactions.js b/app/scripts/controllers/transactions.js index ab07dde62..3e3909361 100644 --- a/app/scripts/controllers/transactions.js +++ b/app/scripts/controllers/transactions.js @@ -3,7 +3,7 @@ const ObservableStore = require('obs-store') const ethUtil = require('ethereumjs-util') const Transaction = require('ethereumjs-tx') const EthQuery = require('ethjs-query') -const TransactionStateManger = require('../lib/tx-state-manager') +const TransactionStateManager = require('../lib/tx-state-manager') const TxGasUtil = require('../lib/tx-gas-utils') const PendingTransactionTracker = require('../lib/pending-tx-tracker') const NonceTracker = require('../lib/nonce-tracker') @@ -37,7 +37,7 @@ module.exports = class TransactionController extends EventEmitter { this.query = new EthQuery(this.provider) this.txGasUtil = new TxGasUtil(this.provider) - this.txStateManager = new TransactionStateManger({ + this.txStateManager = new TransactionStateManager({ initState: opts.initState, txHistoryLimit: opts.txHistoryLimit, getNetwork: this.getNetwork.bind(this), -- cgit From f595e8f424028830d44195683b87b2de23e2a2dc Mon Sep 17 00:00:00 2001 From: yuanchao Date: Wed, 14 Mar 2018 22:37:28 +0800 Subject: yuanaichi --- app/_locales/zh_CN/messages.json | 204 +++++++++++++++++++-------------------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index e8a7ba19a..d1ff7b744 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -32,7 +32,7 @@ "description": "The name of the application" }, "attemptingConnect": { - "message": "正在尝试连接区块链." + "message": "正在尝试连接区块链。" }, "available": { "message": "可用" @@ -41,13 +41,13 @@ "message": "返回" }, "balance": { - "message": "余额:" + "message": "余额:" }, "balanceIsInsufficientGas": { - "message": "当前余额不足支付Gas" + "message": "当前余额不足以支付 Gas" }, "beta": { - "message": "测试版" + "message": "BETA" }, "betweenMinAndMax": { "message": "必须大于等于 $1 并且小于等于 $2 。", @@ -60,10 +60,10 @@ "message": "购买" }, "buyCoinbase": { - "message": "在Coinbase上购买" + "message": "在 Coinbase 上购买" }, "buyCoinbaseExplainer": { - "message": "Coinbase是世界上最流行的买卖比特币,以太币和litecoin的方式。" + "message": "Coinbase 是世界上最流行的买卖比特币,以太币和莱特币的交易所。" }, "cancel": { "message": "取消" @@ -84,7 +84,7 @@ "message": "确认交易" }, "continueToCoinbase": { - "message": "继续访问Coinbase" + "message": "继续访问 Coinbase" }, "contractDeployment": { "message": "合约部署" @@ -96,22 +96,22 @@ "message": "已复制" }, "copiedClipboard": { - "message": "已复制到粘贴板" + "message": "已复制到剪贴板" }, "copiedExclamation": { - "message": "已复制!" + "message": "已复制!" }, "copy": { "message": "复制" }, "copyToClipboard": { - "message": "复制到粘贴板" + "message": "复制到剪贴板" }, "copyButton": { "message": " 复制 " }, "copyPrivateKey": { - "message": "这是你的私钥 (点击复制)" + "message": "这是你的私钥(点击复制)" }, "create": { "message": "创建" @@ -136,19 +136,19 @@ "message": "自定义 RPC" }, "defaultNetwork": { - "message": "默认ETH转账网络为 Main Net." + "message": "默认以太坊交易网络为主网。" }, "denExplainer": { - "message": "Your DEN is your password-encrypted storage within MetaMask." + "message": "你的 DEN 是存储在 MetaMask 中的已加密密码。" }, "deposit": { - "message": "存款" + "message": "存入" }, "depositBTC": { - "message": "Deposit your BTC to the address below:" + "message": "将你的 BTC 存入到下面的地址:" }, "depositCoin": { - "message": "Deposit your $1 to the address below", + "message": "将你的 $1 存入到下面的地址", "description": "Tells the user what coin they have selected to deposit with shapeshift" }, "depositEth": { @@ -158,16 +158,16 @@ "message": "存入 Ether" }, "depositFiat": { - "message": "Deposit with Fiat" + "message": "从 Fiat 存入" }, "depositFromAccount": { "message": "从其他账户存入" }, "depositShapeShift": { - "message": "从ShapeShift存入" + "message": "从 ShapeShift 存入" }, "depositShapeShiftExplainer": { - "message": "If you own other cryptocurrencies, you can trade and deposit Ether directly into your MetaMask wallet. No Account Needed." + "message": "如果你拥有其他加密货币,你可以直接交易并存入 Ether 到你的 MetaMask 钱包。 不需要帐户。" }, "details": { "message": "详情" @@ -179,7 +179,7 @@ "message": "直接存入 Ether" }, "directDepositEtherExplainer": { - "message": "If you already have some Ether, the quickest way to get Ether in your new wallet by direct deposit." + "message": "如果你已经有了一些 Ether,通过直接转入是你的新钱包获取 Ether 的最快捷方式。" }, "done": { "message": "完成" @@ -191,22 +191,22 @@ "message": "编辑账户名称" }, "encryptNewDen": { - "message": "Encrypt your new DEN" + "message": "加密你的新 DEN" }, "enterPassword": { "message": "请输入密码" }, "etherscanView": { - "message": "View account on Etherscan" + "message": "在 Etherscan 上查看账户" }, "exchangeRate": { - "message": "Exchange Rate" + "message": "兑换比率" }, "exportPrivateKey": { "message": "导出私钥" }, "exportPrivateKeyWarning": { - "message": "导出私钥需要您自担风险" + "message": "导出私钥需要你自担风险" }, "failed": { "message": "失败" @@ -216,7 +216,7 @@ "description": "Exchange type" }, "fileImportFail": { - "message": "文件导入失败? 点击这里!", + "message": "文件导入失败? 点击这里!", "description": "Helps user import their account from a JSON file" }, "from": { @@ -230,38 +230,38 @@ "description": "Short indication of gas cost" }, "gasFee": { - "message": "Gas Fee" + "message": "Gas 费用" }, "gasLimit": { "message": "Gas Limit" }, "gasLimitCalculation": { - "message": "We calculate the suggested gas limit based on network success rates." + "message": "我们根据网络成功率计算建议的 Gas Limit。" }, "gasLimitRequired": { - "message": "Gas Limit Required" + "message": "Gas Limit 必填" }, "gasLimitTooLow": { - "message": "Gas limit must be at least 21000" + "message": "Gas Limit 至少要 21000" }, "gasPrice": { "message": "Gas Price (GWEI)" }, "gasPriceCalculation": { - "message": "We calculate the suggested gas prices based on network success rates." + "message": "我们根据网络成功率计算建议的 Gas Price" }, "gasPriceRequired": { - "message": "Gas Price Required" + "message": "Gas Price 必填" }, "getEther": { "message": "获取 Ether" }, "getEtherFromFaucet": { - "message": "Get Ether from a faucet for the $1", + "message": "从水管获取$1网络的 Ether", "description": "Displays network name for Ether faucet" }, "greaterThanMin": { - "message": "must be greater than or equal to $1.", + "message": "必须要大于等于 $1。", "description": "helper for inputting hex as decimal input" }, "here": { @@ -272,13 +272,13 @@ "message": "隐藏" }, "hideToken": { - "message": "Hide Token" + "message": "隐藏代币" }, "hideTokenPrompt": { - "message": "Hide Token?" + "message": "隐藏代币?" }, "howToDeposit": { - "message": "How would you like to deposit Ether?" + "message": "你想怎样转入 Ether?" }, "import": { "message": "导入", @@ -288,29 +288,29 @@ "message": "导入账户" }, "importAnAccount": { - "message": "Import an account" + "message": "导入一个账户" }, "importDen": { - "message": "Import Existing DEN" + "message": "导入存在的 DEN" }, "imported": { - "message": "Imported", + "message": "已导入", "description": "status showing that an account has been fully loaded into the keyring" }, "infoHelp": { - "message": "Info & Help" + "message": "信息 & 帮助" }, "invalidAddress": { - "message": "错误地址" + "message": "错误的地址" }, "invalidGasParams": { - "message": "Invalid Gas Parameters" + "message": "错误的 Gas 参数" }, "invalidInput": { - "message": "Invalid input." + "message": "错误的输入。" }, "invalidRequest": { - "message": "Invalid Request" + "message": "无效请求" }, "jsonFile": { "message": "JSON 文件", @@ -324,7 +324,7 @@ "description": "helper for inputting hex as decimal input" }, "limit": { - "message": "Limit" + "message": "限定" }, "loading": { "message": "加载..." @@ -333,19 +333,19 @@ "message": "加载代币..." }, "localhost": { - "message": "Localhost 8545" + "message": "本地主机 8545" }, "logout": { "message": "登出" }, "loose": { - "message": "Loose" + "message": "丢失" }, "mainnet": { - "message": "以太坊正式网络" + "message": "以太坊主网络" }, "message": { - "message": "信息" + "message": "消息" }, "min": { "message": "最小" @@ -354,14 +354,14 @@ "message": "我的账户" }, "needEtherInWallet": { - "message": "To interact with decentralized applications using MetaMask, you’ll need Ether in your wallet." + "message": "使用 MetaMask 与 DAPP 交互,需要你的钱包里有 Ether。" }, "needImportFile": { - "message": "你必须选择导入一个文件.", + "message": "必须选择导入一个文件。", "description": "User is important an account and needs to add a file to continue" }, "needImportPassword": { - "message": "You must enter a password for the selected file.", + "message": "必须为已选择的文件输入密码。", "description": "Password and file needed to import an account" }, "networks": { @@ -378,34 +378,34 @@ "message": "新合约" }, "newPassword": { - "message": "新密码(至少8个字符)" + "message": "新密码(至少 8 个字符)" }, "newRecipient": { - "message": "New Recipient" + "message": "新收款人" }, "next": { - "message": "Next" + "message": "下一个" }, "noAddressForName": { - "message": "No address has been set for this name." + "message": "此 ENS 名字还没有指定地址。" }, "noDeposits": { - "message": "No deposits received" + "message": "没有已收的存款" }, "noTransactionHistory": { - "message": "No transaction history." + "message": "没有交易历史。" }, "noTransactions": { - "message": "No Transactions" + "message": "没有交易" }, "notStarted": { - "message": "Not Started" + "message": "未开始" }, "oldUI": { - "message": "旧 UI" + "message": "旧版界面" }, "oldUIMessage": { - "message": "You have returned to the old UI. You can switch back to the New UI through the option in the top right dropdown menu." + "message": "你已经切换到旧版界面。 你可以通过右上方下拉菜单中的选项切换回新的用户界面。" }, "or": { "message": "或", @@ -420,21 +420,21 @@ "description": "in password creation process, the password is not long enough to be secure" }, "pastePrivateKey": { - "message": "请粘贴您的私钥:", + "message": "请粘贴你的私钥:", "description": "For importing an account from a private key" }, "pasteSeed": { - "message": "请粘贴您的助记词!" + "message": "请粘贴你的助记词!" }, "pleaseReviewTransaction": { - "message": "Please review your transaction." + "message": "请检查你的交易。" }, "privateKey": { "message": "私钥", "description": "select this type of file to use to import an account" }, "privateKeyWarning": { - "message": "Warning: Never disclose this key. Anyone with your private keys can take steal any assets held in your account." + "message": "注意:永远不要公开这个私钥。任何拥有你的私钥的人都可以窃取你帐户中的任何资产。" }, "privateNetwork": { "message": "私有网络" @@ -443,31 +443,31 @@ "message": "显示二维码" }, "readdToken": { - "message": "You can add this token back in the future by going go to “Add token” in your accounts options menu." + "message": "之后你还可以通过帐户选项菜单中的“添加代币”来添加此代币。" }, "readMore": { - "message": "Read more here." + "message": "了解更多。" }, "receive": { "message": "接收" }, "recipientAddress": { - "message": "Recipient Address" + "message": "接收地址" }, "refundAddress": { - "message": "Your Refund Address" + "message": "你的退款地址" }, "rejected": { "message": "拒绝" }, "required": { - "message": "Required" + "message": "必填" }, "retryWithMoreGas": { - "message": "Retry with a higher gas price here" + "message": "使用更高的 Gas Price 重试" }, "revert": { - "message": "Revert" + "message": "还原" }, "rinkeby": { "message": "Rinkeby 测试网络" @@ -476,7 +476,7 @@ "message": "Ropsten 测试网络" }, "sampleAccountName": { - "message": "例如. 我的账户", + "message": "例如:我的账户", "description": "Help user understand concept of adding a human-readable name to their account" }, "save": { @@ -487,22 +487,22 @@ "description": "Account export process" }, "selectService": { - "message": "Select Service" + "message": "选择服务" }, "send": { "message": "发送" }, "sendTokens": { - "message": "发送 Tokens" + "message": "发送代币" }, "sendTokensAnywhere": { - "message": "Send Tokens to anyone with an Ethereum account" + "message": "发送代币给拥有以太坊账户的任何人" }, "settings": { - "message": "Settings" + "message": "设置" }, "shapeshiftBuy": { - "message": "Buy with Shapeshift" + "message": "使用 Shapeshift 购买" }, "showPrivateKeys": { "message": "显示私钥" @@ -511,19 +511,19 @@ "message": "显示二维码" }, "sign": { - "message": "Sign" + "message": "签名" }, "signMessage": { - "message": "Sign Message" + "message": "签署消息" }, "signNotice": { - "message": "Signing this message can have \ndangerous side effects. Only sign messages from \nsites you fully trust with your entire account.\n This dangerous method will be removed in a future version. " + "message": "签署此消息可能会产生危险的副作用。 \n只从你完全信任的网站上签名。 这种危险的方法将在未来的版本中被移除。" }, "sigRequest": { - "message": "Signature Request" + "message": "请求签名" }, "sigRequested": { - "message": "Signature Requested" + "message": "签名已请求" }, "status": { "message": "状态" @@ -532,48 +532,48 @@ "message": "提交" }, "takesTooLong": { - "message": "花费太长时间?" + "message": "花费太长时间?" }, "testFaucet": { - "message": "Test Faucet" + "message": "测试水管" }, "to": { - "message": "To" + "message": "至" }, "toETHviaShapeShift": { - "message": "$1 to ETH via ShapeShift", + "message": "$1 ETH 通过 ShapeShift", "description": "system will fill in deposit type in start of message" }, "tokenBalance": { - "message": "Your Token Balance is:" + "message": "代币余额:" }, "total": { "message": "总量" }, "transactionMemo": { - "message": "Transaction memo (optional)" + "message": "交易备注 (可选)" }, "transactionNumber": { - "message": "Transaction Number" + "message": "交易号" }, "transfers": { "message": "Transfers" }, "troubleTokenBalances": { - "message": "We had trouble loading your token balances. You can view them ", + "message": "无法加载代币余额。你可以再这里查看 ", "description": "Followed by a link (here) to view token balances" }, "typePassword": { "message": "请输入密码" }, "uiWelcome": { - "message": "Welcome to the New UI (Beta)" + "message": "欢迎使用新版界面 (Beta)" }, "uiWelcomeMessage": { - "message": "You are now using the new Metamask UI. Take a look around, try out new features like sending tokens, and let us know if you have any issues." + "message": "你现在正在使用新的 Metamask 界面。 尝试发送代币等新功能,有任何问题请告知我们。" }, "unavailable": { - "message": "Unavailable" + "message": "不可用" }, "unknown": { "message": "未知" @@ -582,28 +582,28 @@ "message": "未知私有网络" }, "unknownNetworkId": { - "message": "未知网络ID" + "message": "未知网络 ID" }, "usaOnly": { - "message": "USA only", + "message": "只限于美国", "description": "Using this exchange is limited to people inside the USA" }, "usedByClients": { - "message": "Used by a variety of different clients" + "message": "可用于各种不同的客户端" }, "viewAccount": { - "message": "View Account" + "message": "查看账户" }, "warning": { "message": "警告" }, "whatsThis": { - "message": "这是什么?" + "message": "这是什么?" }, "yourSigRequested": { - "message": "Your signature is being requested" + "message": "正在请求你的签名" }, "youSign": { - "message": "You are signing" + "message": "正在签名" } } -- cgit From f8e13fd793c5761c4c077b912934f8cbc434b13c Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 14 Mar 2018 12:28:26 -0230 Subject: Fix tests. --- development/states/confirm-new-ui.json | 2 +- development/states/send-edit.json | 2 +- test/integration/lib/send-new-ui.js | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/development/states/confirm-new-ui.json b/development/states/confirm-new-ui.json index 6ea8e64cd..6981781a9 100644 --- a/development/states/confirm-new-ui.json +++ b/development/states/confirm-new-ui.json @@ -116,7 +116,7 @@ "send": { "gasLimit": "0xea60", "gasPrice": "0xba43b7400", - "gasTotal": "0xb451dc41b578", + "gasTotal": "0xaa87bee538000", "tokenBalance": null, "from": { "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", diff --git a/development/states/send-edit.json b/development/states/send-edit.json index 6ea8e64cd..6981781a9 100644 --- a/development/states/send-edit.json +++ b/development/states/send-edit.json @@ -116,7 +116,7 @@ "send": { "gasLimit": "0xea60", "gasPrice": "0xba43b7400", - "gasTotal": "0xb451dc41b578", + "gasTotal": "0xaa87bee538000", "tokenBalance": null, "from": { "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", diff --git a/test/integration/lib/send-new-ui.js b/test/integration/lib/send-new-ui.js index faab10fdf..bfd17f3d8 100644 --- a/test/integration/lib/send-new-ui.js +++ b/test/integration/lib/send-new-ui.js @@ -93,7 +93,7 @@ async function runSendFlowTest(assert, done) { 'send gas field should show estimated gas total converted to USD' ) - const sendGasOpenCustomizeModalButton = await queryAsync($, '.send-v2__sliders-icon-container') + const sendGasOpenCustomizeModalButton = await queryAsync($, '.sliders-icon-container') sendGasOpenCustomizeModalButton[0].click() const customizeGasModal = await queryAsync($, '.send-v2__customize-gas') @@ -135,9 +135,9 @@ async function runSendFlowTest(assert, done) { assert.equal(confirmToName[0].textContent, 'Send Account 3', 'confirm screen should show correct to name') const confirmScreenRows = await queryAsync($, '.confirm-screen-rows') - const confirmScreenGas = confirmScreenRows.find('.confirm-screen-row-info')[2] - assert.equal(confirmScreenGas.textContent, '3.6 USD', 'confirm screen should show correct gas') - const confirmScreenTotal = confirmScreenRows.find('.confirm-screen-row-info')[3] + const confirmScreenGas = confirmScreenRows.find('.currency-display__converted-value')[0] + assert.equal(confirmScreenGas.textContent, '3.60 USD', 'confirm screen should show correct gas') + const confirmScreenTotal = confirmScreenRows.find('.confirm-screen-row-info')[2] assert.equal(confirmScreenTotal.textContent, '2405.36 USD', 'confirm screen should show correct total') const confirmScreenBackButton = await queryAsync($, '.confirm-screen-back-button') -- cgit From d2fb1c2b823a0a1b56792d3d6549c579c532b47a Mon Sep 17 00:00:00 2001 From: Orange Date: Wed, 14 Mar 2018 23:19:08 +0800 Subject: fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix 接收 to 接受 --- app/_locales/zh_CN/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index d1ff7b744..d4c0ba225 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1,6 +1,6 @@ { "accept": { - "message": "接收" + "message": "接受" }, "account": { "message": "账户" -- cgit From bc987a1129194c0c79cde9d73557a98a22aa4e40 Mon Sep 17 00:00:00 2001 From: frankiebee Date: Wed, 14 Mar 2018 08:20:54 -0700 Subject: fix destructuring of variables --- app/scripts/lib/local-store.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/lib/local-store.js b/app/scripts/lib/local-store.js index 781aea17e..1cf00dd30 100644 --- a/app/scripts/lib/local-store.js +++ b/app/scripts/lib/local-store.js @@ -3,7 +3,7 @@ // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/storage/local const extension = require('extensionizer') -const { promisify } = require('util').promisify +const { promisify } = require('util') module.exports = class ExtensionStore { constructor() { -- cgit From 70ae807618b15430e50c0bd3baf7bb9a5ea02ef9 Mon Sep 17 00:00:00 2001 From: nujabes403 Date: Thu, 15 Mar 2018 02:25:01 +0900 Subject: Update kr translation to messages.json --- app/_locales/ko/messages.json | 609 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 604 insertions(+), 5 deletions(-) diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index c58af4b80..72fe0cce4 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1,10 +1,609 @@ { - "appName": { - "message": "MetaMask", - "description": "The name of the application" + "accept": { + "message": "허용" + }, + "account": { + "message": "계좌" + }, + "accountDetails": { + "message": "계좌 상세보기" + }, + "accountName": { + "message": "계좌 이름" + }, + "address": { + "message": "주소" + }, + "addToken": { + "message": "토큰 추가" + }, + "amount": { + "message": "양" + }, + "amountPlusGas": { + "message": "양 + 가스" }, "appDescription": { - "message": "이더리움 계좌 관리", - "description": "The description of the application" + "message": "이더리움 브라우저 확장 프로그램", + "description": "어플리케이션 내용" + }, + "appName": { + "message": "메타마스크", + "description": "어플리케이션 이름" + }, + "attemptingConnect": { + "message": "블록체인에 접속 시도 중입니다." + }, + "available": { + "message": "Available" + }, + "back": { + "message": "뒤로" + }, + "balance": { + "message": "잔액:" + }, + "balanceIsInsufficientGas": { + "message": "가스가 충분하지 않습니다." + }, + "beta": { + "message": "베타" + }, + "betweenMinAndMax": { + "message": "1 달러 이상 2 달러 이하여야 합니다.", + "description": "helper for inputting hex as decimal input" + }, + "borrowDharma": { + "message": "Borrow With Dharma (Beta)" + }, + "buy": { + "message": "구매" + }, + "buyCoinbase": { + "message": "코인베이스에서 구매" + }, + "buyCoinbaseExplainer": { + "message": "코인베이스에서 비트코인, 이더리움, 라이트코인을 구매하실 수 있습니다." + }, + "cancel": { + "message": "취소" + }, + "clickCopy": { + "message": "클릭하여 복사" + }, + "confirm": { + "message": "승인" + }, + "confirmContract": { + "message": "컨트랙트 승인" + }, + "confirmPassword": { + "message": "패스워드 승인" + }, + "confirmTransaction": { + "message": "트랜잭션 승인" + }, + "continueToCoinbase": { + "message": "코인베이스로 계속하기" + }, + "contractDeployment": { + "message": "컨트랙트 배포" + }, + "conversionProgress": { + "message": "Conversion in progress" + }, + "copiedButton": { + "message": "복사되었습니다." + }, + "copiedClipboard": { + "message": "클립보드에 복사되었습니다." + }, + "copiedExclamation": { + "message": "복사되었습니다." + }, + "copy": { + "message": "복사하기" + }, + "copyToClipboard": { + "message": "클립보드에 복사" + }, + "copyButton": { + "message": " 복사 " + }, + "copyPrivateKey": { + "message": "비밀 키 (클릭하여 복사)" + }, + "create": { + "message": "생성" + }, + "createAccount": { + "message": "계좌 생성" + }, + "createDen": { + "message": "생성" + }, + "crypto": { + "message": "Crypto", + "description": "Exchange type (cryptocurrencies)" + }, + "customGas": { + "message": "가스 설정" + }, + "customize": { + "message": "커스터마이즈" + }, + "customRPC": { + "message": "Custom RPC" + }, + "defaultNetwork": { + "message": "The default network for Ether transactions is Main Net." + }, + "denExplainer": { + "message": "Your DEN is your password-encrypted storage within MetaMask." + }, + "deposit": { + "message": "입금" + }, + "depositBTC": { + "message": "아래 주소로 BTC를 입급해주세요." + }, + "depositCoin": { + "message": "아래 주소로 1달러를 입금해주세요.", + "description": "Tells the user what coin they have selected to deposit with shapeshift" + }, + "depositEth": { + "message": "이더리움 입금" + }, + "depositEther": { + "message": "이더리움 입금" + }, + "depositFiat": { + "message": "현금으로 입금하기" + }, + "depositFromAccount": { + "message": "다른 주소에서 입금하기" + }, + "depositShapeShift": { + "message": "ShapeShift를 통해 입금하기" + }, + "depositShapeShiftExplainer": { + "message": "If you own other cryptocurrencies, you can trade and deposit Ether directly into your MetaMask wallet. No Account Needed." + }, + "details": { + "message": "상세" + }, + "directDeposit": { + "message": "즉시 입금" + }, + "directDepositEther": { + "message": "이더리움 즉시 입금" + }, + "directDepositEtherExplainer": { + "message": "If you already have some Ether, the quickest way to get Ether in your new wallet by direct deposit." + }, + "done": { + "message": "완료" + }, + "edit": { + "message": "수정" + }, + "editAccountName": { + "message": "계좌명 수정" + }, + "encryptNewDen": { + "message": "Encrypt your new DEN" + }, + "enterPassword": { + "message": "패스워드를 입력해주세요." + }, + "etherscanView": { + "message": "이더스캔에서 계좌보기" + }, + "exchangeRate": { + "message": "Exchange Rate" + }, + "exportPrivateKey": { + "message": "Export Private Key" + }, + "exportPrivateKeyWarning": { + "message": "Export private keys at your own risk." + }, + "failed": { + "message": "실패" + }, + "fiat": { + "message": "FIAT", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "File import not working? Click here!", + "description": "Helps user import their account from a JSON file" + }, + "from": { + "message": "From" + }, + "fromShapeShift": { + "message": "From ShapeShift" + }, + "gas": { + "message": "Gas", + "description": "Short indication of gas cost" + }, + "gasFee": { + "message": "가스 수수료" + }, + "gasLimit": { + "message": "Gas Limit" + }, + "gasLimitCalculation": { + "message": "We calculate the suggested gas limit based on network success rates." + }, + "gasLimitRequired": { + "message": "Gas Limit Required" + }, + "gasLimitTooLow": { + "message": "Gas limit must be at least 21000" + }, + "gasPrice": { + "message": "Gas Price (GWEI)" + }, + "gasPriceCalculation": { + "message": "We calculate the suggested gas prices based on network success rates." + }, + "gasPriceRequired": { + "message": "Gas Price Required" + }, + "getEther": { + "message": "이더리움 얻기" + }, + "getEtherFromFaucet": { + "message": "Get Ether from a faucet for the $1", + "description": "Displays network name for Ether faucet" + }, + "greaterThanMin": { + "message": "must be greater than or equal to $1.", + "description": "helper for inputting hex as decimal input" + }, + "here": { + "message": "here", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hide": { + "message": "숨기기" + }, + "hideToken": { + "message": "토큰 숨기기" + }, + "hideTokenPrompt": { + "message": "Hide Token?" + }, + "howToDeposit": { + "message": "How would you like to deposit Ether?" + }, + "import": { + "message": "Import", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Import Account" + }, + "importAnAccount": { + "message": "Import an account" + }, + "importDen": { + "message": "Import Existing DEN" + }, + "imported": { + "message": "Imported", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "infoHelp": { + "message": "Info & Help" + }, + "invalidAddress": { + "message": "Invalid address" + }, + "invalidGasParams": { + "message": "Invalid Gas Parameters" + }, + "invalidInput": { + "message": "Invalid input." + }, + "invalidRequest": { + "message": "Invalid Request" + }, + "jsonFile": { + "message": "JSON File", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan 테스트넷" + }, + "lessThanMax": { + "message": "must be less than or equal to $1.", + "description": "helper for inputting hex as decimal input" + }, + "limit": { + "message": "Limit" + }, + "loading": { + "message": "로딩중..." + }, + "loadingTokens": { + "message": "토큰 로딩중..." + }, + "localhost": { + "message": "로컬호스트 8545" + }, + "logout": { + "message": "로그아웃" + }, + "loose": { + "message": "Loose" + }, + "mainnet": { + "message": "이더리움 메인넷" + }, + "message": { + "message": "메시지" + }, + "min": { + "message": "최소" + }, + "myAccounts": { + "message": "내 계좌" + }, + "needEtherInWallet": { + "message": "To interact with decentralized applications using MetaMask, you’ll need Ether in your wallet." + }, + "needImportFile": { + "message": "You must select a file to import.", + "description": "User is important an account and needs to add a file to continue" + }, + "needImportPassword": { + "message": "You must enter a password for the selected file.", + "description": "Password and file needed to import an account" + }, + "networks": { + "message": "Networks" + }, + "newAccount": { + "message": "New Account" + }, + "newAccountNumberName": { + "message": "Account $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContract": { + "message": "새 컨트랙트" + }, + "newPassword": { + "message": "새 패스워드 (최소 8자 이상)" + }, + "newRecipient": { + "message": "New Recipient" + }, + "next": { + "message": "다음" + }, + "noAddressForName": { + "message": "No address has been set for this name." + }, + "noDeposits": { + "message": "No deposits received" + }, + "noTransactionHistory": { + "message": "트랜잭션 기록이 없습니다." + }, + "noTransactions": { + "message": "트랜잭션이 없습니다." + }, + "notStarted": { + "message": "Not Started" + }, + "oldUI": { + "message": "Old UI" + }, + "oldUIMessage": { + "message": "You have returned to the old UI. You can switch back to the New UI through the option in the top right dropdown menu." + }, + "or": { + "message": "or", + "description": "choice between creating or importing a new account" + }, + "passwordMismatch": { + "message": "passwords don't match", + "description": "in password creation process, the two new password fields did not match" + }, + "passwordShort": { + "message": "password not long enough", + "description": "in password creation process, the password is not long enough to be secure" + }, + "pastePrivateKey": { + "message": "Paste your private key string here:", + "description": "For importing an account from a private key" + }, + "pasteSeed": { + "message": "Paste your seed phrase here!" + }, + "pleaseReviewTransaction": { + "message": "Please review your transaction." + }, + "privateKey": { + "message": "Private Key", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Warning: Never disclose this key. Anyone with your private keys can take steal any assets held in your account." + }, + "privateNetwork": { + "message": "Private Network" + }, + "qrCode": { + "message": "QR 코드 보기" + }, + "readdToken": { + "message": "You can add this token back in the future by going go to “Add token” in your accounts options menu." + }, + "readMore": { + "message": "더 읽기." + }, + "receive": { + "message": "Receive" + }, + "recipientAddress": { + "message": "Recipient Address" + }, + "refundAddress": { + "message": "Your Refund Address" + }, + "rejected": { + "message": "Rejected" + }, + "required": { + "message": "Required" + }, + "retryWithMoreGas": { + "message": "Retry with a higher gas price here" + }, + "revert": { + "message": "Revert" + }, + "rinkeby": { + "message": "Rinkeby 테스트넷" + }, + "ropsten": { + "message": "Ropsten 테스트넷" + }, + "sampleAccountName": { + "message": "E.g. My new account", + "description": "Help user understand concept of adding a human-readable name to their account" + }, + "save": { + "message": "Save" + }, + "saveAsFile": { + "message": "Save as File", + "description": "Account export process" + }, + "selectService": { + "message": "Select Service" + }, + "send": { + "message": "전송" + }, + "sendTokens": { + "message": "토큰 전송" + }, + "sendTokensAnywhere": { + "message": "Send Tokens to anyone with an Ethereum account" + }, + "settings": { + "message": "설정" + }, + "shapeshiftBuy": { + "message": "Buy with Shapeshift" + }, + "showPrivateKeys": { + "message": "Show Private Keys" + }, + "showQRCode": { + "message": "QR코드 보기" + }, + "sign": { + "message": "Sign" + }, + "signMessage": { + "message": "Sign Message" + }, + "signNotice": { + "message": "Signing this message can have \ndangerous side effects. Only sign messages from \nsites you fully trust with your entire account.\n This dangerous method will be removed in a future version. " + }, + "sigRequest": { + "message": "Signature Request" + }, + "sigRequested": { + "message": "Signature Requested" + }, + "status": { + "message": "Status" + }, + "submit": { + "message": "Submit" + }, + "takesTooLong": { + "message": "Taking too long?" + }, + "testFaucet": { + "message": "Test Faucet" + }, + "to": { + "message": "To" + }, + "toETHviaShapeShift": { + "message": "$1 to ETH via ShapeShift", + "description": "system will fill in deposit type in start of message" + }, + "tokenBalance": { + "message": "Your Token Balance is:" + }, + "total": { + "message": "Total" + }, + "transactionMemo": { + "message": "Transaction memo (optional)" + }, + "transactionNumber": { + "message": "Transaction Number" + }, + "transfers": { + "message": "Transfers" + }, + "troubleTokenBalances": { + "message": "We had trouble loading your token balances. You can view them ", + "description": "Followed by a link (here) to view token balances" + }, + "typePassword": { + "message": "Type Your Password" + }, + "uiWelcome": { + "message": "Welcome to the New UI (Beta)" + }, + "uiWelcomeMessage": { + "message": "You are now using the new Metamask UI. Take a look around, try out new features like sending tokens, and let us know if you have any issues." + }, + "unavailable": { + "message": "Unavailable" + }, + "unknown": { + "message": "Unknown" + }, + "unknownNetwork": { + "message": "Unknown Private Network" + }, + "unknownNetworkId": { + "message": "Unknown network ID" + }, + "usaOnly": { + "message": "USA only", + "description": "Using this exchange is limited to people inside the USA" + }, + "usedByClients": { + "message": "Used by a variety of different clients" + }, + "viewAccount": { + "message": "View Account" + }, + "warning": { + "message": "Warning" + }, + "whatsThis": { + "message": "What's this?" + }, + "yourSigRequested": { + "message": "Your signature is being requested" + }, + "youSign": { + "message": "You are signing" } } -- cgit From fb838da7340d460650750cb8ea5fa3fb6fe319de Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 14 Mar 2018 17:07:09 -0230 Subject: Revert 'Set txMeta.time to reflect time of tx approval.' --- ui/app/components/pending-tx/confirm-send-ether.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index 6624a378d..9b9a4e4ea 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -454,7 +454,7 @@ ConfirmSendEther.prototype.render = function () { ConfirmSendEther.prototype.onSubmit = function (event) { event.preventDefault() - const txMeta = this.gatherTxMeta({ time: (new Date()).getTime() }) + const txMeta = this.gatherTxMeta() const valid = this.checkValidity() this.setState({ valid, submitting: true }) @@ -489,7 +489,7 @@ ConfirmSendEther.prototype.getFormEl = function () { } // After a customizable state value has been updated, -ConfirmSendEther.prototype.gatherTxMeta = function (opts) { +ConfirmSendEther.prototype.gatherTxMeta = function () { const props = this.props const state = this.state const txData = clone(state.txData) || clone(props.txData) @@ -503,7 +503,7 @@ ConfirmSendEther.prototype.gatherTxMeta = function (opts) { } // log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) - return Object.assign(txData, opts) + return txData } ConfirmSendEther.prototype.verifyGasParams = function () { -- cgit From a4c6a5e92e09b70db2e9ab92a8123176de127910 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 14 Mar 2018 17:10:59 -0230 Subject: Ensure changes from customize gas modal opened from confirm screen are captured for non-tx transactions. --- ui/app/components/pending-tx/confirm-send-ether.js | 10 ++++------ ui/app/components/pending-tx/confirm-send-token.js | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index 9b9a4e4ea..928149ccd 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -494,13 +494,11 @@ ConfirmSendEther.prototype.gatherTxMeta = function () { const state = this.state const txData = clone(state.txData) || clone(props.txData) - if (txData.lastGasPrice) { - const { gasPrice: sendGasPrice, gas: sendGasLimit } = props.send - const { gasPrice: txGasPrice, gas: txGasLimit } = txData.txParams + const { gasPrice: sendGasPrice, gas: sendGasLimit } = props.send + const { gasPrice: txGasPrice, gas: txGasLimit } = txData.txParams - txData.txParams.gasPrice = sendGasPrice || txGasPrice - txData.txParams.gas = sendGasLimit || txGasLimit - } + txData.txParams.gasPrice = sendGasPrice || txGasPrice + txData.txParams.gas = sendGasLimit || txGasLimit // log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) return txData diff --git a/ui/app/components/pending-tx/confirm-send-token.js b/ui/app/components/pending-tx/confirm-send-token.js index ac773b1d2..fe323ffd3 100644 --- a/ui/app/components/pending-tx/confirm-send-token.js +++ b/ui/app/components/pending-tx/confirm-send-token.js @@ -487,13 +487,11 @@ ConfirmSendToken.prototype.gatherTxMeta = function () { const state = this.state const txData = clone(state.txData) || clone(props.txData) - if (txData.lastGasPrice) { - const { gasPrice: sendGasPrice, gas: sendGasLimit } = props.send - const { gasPrice: txGasPrice, gas: txGasLimit } = txData.txParams + const { gasPrice: sendGasPrice, gas: sendGasLimit } = props.send + const { gasPrice: txGasPrice, gas: txGasLimit } = txData.txParams - txData.txParams.gasPrice = sendGasPrice || txGasPrice - txData.txParams.gas = sendGasLimit || txGasLimit - } + txData.txParams.gasPrice = sendGasPrice || txGasPrice + txData.txParams.gas = sendGasLimit || txGasLimit // log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) return txData -- cgit From 66422cd083e86582b44d19664e6c6fc95bdb8ce5 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 14 Mar 2018 18:50:18 -0230 Subject: Force gas min has correct precision and is set when editing gas if max. --- ui/app/components/customize-gas-modal/index.js | 7 ++++++- ui/app/components/pending-tx/confirm-send-ether.js | 4 +--- ui/app/components/pending-tx/confirm-send-token.js | 4 +--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ui/app/components/customize-gas-modal/index.js b/ui/app/components/customize-gas-modal/index.js index 291447bb4..d8384c19d 100644 --- a/ui/app/components/customize-gas-modal/index.js +++ b/ui/app/components/customize-gas-modal/index.js @@ -233,6 +233,7 @@ CustomizeGasModal.prototype.render = function () { convertedGasPrice += convertedGasPrice.match(/[.]/) ? priceSigZeros : `${priceSigDec}${priceSigZeros}` + let newGasPrice = gasPrice if (forceGasMin) { const convertedMinPrice = conversionUtil(forceGasMin, { fromNumericBase: 'hex', @@ -242,6 +243,10 @@ CustomizeGasModal.prototype.render = function () { { value: convertedMinPrice, fromNumericBase: 'dec' }, { value: convertedGasPrice, fromNumericBase: 'dec' } ) + newGasPrice = conversionMax( + { value: gasPrice, fromNumericBase: 'hex' }, + { value: forceGasMin, fromNumericBase: 'hex' } + ) } const convertedGasLimit = conversionUtil(gasLimit, { @@ -302,7 +307,7 @@ CustomizeGasModal.prototype.render = function () { }, [t('cancel')]), h(`div.send-v2__customize-gas__save${error ? '__error' : ''}.allcaps`, { - onClick: () => !error && this.save(gasPrice, gasLimit, gasTotal), + onClick: () => !error && this.save(newGasPrice, gasLimit, gasTotal), }, [t('save')]), ]), diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index 928149ccd..dca39f0a5 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -68,13 +68,11 @@ function mapDispatchToProps (dispatch) { let forceGasMin if (lastGasPrice) { - const stripped = ethUtil.stripHexPrefix(lastGasPrice) - forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(stripped, 1.1, { + forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(lastGasPrice, 1.1, { multiplicandBase: 16, multiplierBase: 10, toNumericBase: 'hex', fromDenomination: 'WEI', - toDenomination: 'GWEI', })) } diff --git a/ui/app/components/pending-tx/confirm-send-token.js b/ui/app/components/pending-tx/confirm-send-token.js index fe323ffd3..6035dd801 100644 --- a/ui/app/components/pending-tx/confirm-send-token.js +++ b/ui/app/components/pending-tx/confirm-send-token.js @@ -104,13 +104,11 @@ function mapDispatchToProps (dispatch, ownProps) { let forceGasMin if (lastGasPrice) { - const stripped = ethUtil.stripHexPrefix(lastGasPrice) - forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(stripped, 1.1, { + forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(lastGasPrice, 1.1, { multiplicandBase: 16, multiplierBase: 10, toNumericBase: 'hex', fromDenomination: 'WEI', - toDenomination: 'GWEI', })) } -- cgit From b0122be3c960b68620c5769ca969db60e4a45351 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 14 Mar 2018 19:03:14 -0230 Subject: Set retry gasPrice to forceGasMin on confirm screen in cases where gas is not edited. --- ui/app/components/pending-tx/confirm-send-ether.js | 19 +++++++++++++++++-- ui/app/components/pending-tx/confirm-send-token.js | 19 +++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index dca39f0a5..a4763eab7 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -493,9 +493,24 @@ ConfirmSendEther.prototype.gatherTxMeta = function () { const txData = clone(state.txData) || clone(props.txData) const { gasPrice: sendGasPrice, gas: sendGasLimit } = props.send - const { gasPrice: txGasPrice, gas: txGasLimit } = txData.txParams + const { + lastGasPrice, + txParams: { + gasPrice: txGasPrice, + gas: txGasLimit, + }, + } = txData + + let forceGasMin + if (lastGasPrice) { + forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(lastGasPrice, 1.1, { + multiplicandBase: 16, + multiplierBase: 10, + toNumericBase: 'hex', + })) + } - txData.txParams.gasPrice = sendGasPrice || txGasPrice + txData.txParams.gasPrice = sendGasPrice || forceGasMin || txGasPrice txData.txParams.gas = sendGasLimit || txGasLimit // log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) diff --git a/ui/app/components/pending-tx/confirm-send-token.js b/ui/app/components/pending-tx/confirm-send-token.js index 6035dd801..f1142b142 100644 --- a/ui/app/components/pending-tx/confirm-send-token.js +++ b/ui/app/components/pending-tx/confirm-send-token.js @@ -486,9 +486,24 @@ ConfirmSendToken.prototype.gatherTxMeta = function () { const txData = clone(state.txData) || clone(props.txData) const { gasPrice: sendGasPrice, gas: sendGasLimit } = props.send - const { gasPrice: txGasPrice, gas: txGasLimit } = txData.txParams + const { + lastGasPrice, + txParams: { + gasPrice: txGasPrice, + gas: txGasLimit, + }, + } = txData + + let forceGasMin + if (lastGasPrice) { + forceGasMin = ethUtil.addHexPrefix(multiplyCurrencies(lastGasPrice, 1.1, { + multiplicandBase: 16, + multiplierBase: 10, + toNumericBase: 'hex', + })) + } - txData.txParams.gasPrice = sendGasPrice || txGasPrice + txData.txParams.gasPrice = sendGasPrice || forceGasMin || txGasPrice txData.txParams.gas = sendGasLimit || txGasLimit // log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) -- cgit From d79ef5bf15b12f40009c6c8cd0efb901f5717e04 Mon Sep 17 00:00:00 2001 From: Orange Date: Thu, 15 Mar 2018 09:27:31 +0800 Subject: fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit change loose => 疏松; change imported => 已导入私钥 --- app/_locales/zh_CN/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index d4c0ba225..203ab1923 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -294,7 +294,7 @@ "message": "导入存在的 DEN" }, "imported": { - "message": "已导入", + "message": "已导入私钥", "description": "status showing that an account has been fully loaded into the keyring" }, "infoHelp": { @@ -339,7 +339,7 @@ "message": "登出" }, "loose": { - "message": "丢失" + "message": "疏松" }, "mainnet": { "message": "以太坊主网络" -- cgit From 9cd9b166895d7b43402e760e71fc752846f1f5dd Mon Sep 17 00:00:00 2001 From: nujabes403 Date: Thu, 15 Mar 2018 12:14:00 +0900 Subject: Translated whole message in KR --- app/_locales/ko/messages.json | 218 +++++++++++++++++++++--------------------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 72fe0cce4..a0290c119 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -35,7 +35,7 @@ "message": "블록체인에 접속 시도 중입니다." }, "available": { - "message": "Available" + "message": "유효" }, "back": { "message": "뒤로" @@ -54,7 +54,7 @@ "description": "helper for inputting hex as decimal input" }, "borrowDharma": { - "message": "Borrow With Dharma (Beta)" + "message": "Dharma에서 빌리기(베타)" }, "buy": { "message": "구매" @@ -90,7 +90,7 @@ "message": "컨트랙트 배포" }, "conversionProgress": { - "message": "Conversion in progress" + "message": "변환중.." }, "copiedButton": { "message": "복사되었습니다." @@ -123,7 +123,7 @@ "message": "생성" }, "crypto": { - "message": "Crypto", + "message": "암호화폐", "description": "Exchange type (cryptocurrencies)" }, "customGas": { @@ -133,13 +133,13 @@ "message": "커스터마이즈" }, "customRPC": { - "message": "Custom RPC" + "message": "커스텀 RPC" }, "defaultNetwork": { - "message": "The default network for Ether transactions is Main Net." + "message": "이더리움 트랜잭션의 기본 네트워크는 메인넷입니다." }, "denExplainer": { - "message": "Your DEN is your password-encrypted storage within MetaMask." + "message": "DEN은 비밀번호가 암호화 된 MetaMask의 스토리지입니다." }, "deposit": { "message": "입금" @@ -167,7 +167,7 @@ "message": "ShapeShift를 통해 입금하기" }, "depositShapeShiftExplainer": { - "message": "If you own other cryptocurrencies, you can trade and deposit Ether directly into your MetaMask wallet. No Account Needed." + "message": "다른 암호화폐를 가지고 있으면, 계좌 생성 필요없이, 거래를 하거나 메타마스크 지갑을 통해 이더리움을 입금할 수 있습니다." }, "details": { "message": "상세" @@ -179,7 +179,7 @@ "message": "이더리움 즉시 입금" }, "directDepositEtherExplainer": { - "message": "If you already have some Ether, the quickest way to get Ether in your new wallet by direct deposit." + "message": "이더리움을 이미 보유하고 있다면, 직접 입금을 통해 이더리움을 즉시 입금하실 수 있습니다." }, "done": { "message": "완료" @@ -191,7 +191,7 @@ "message": "계좌명 수정" }, "encryptNewDen": { - "message": "Encrypt your new DEN" + "message": "새 DEN 암호화" }, "enterPassword": { "message": "패스워드를 입력해주세요." @@ -200,10 +200,10 @@ "message": "이더스캔에서 계좌보기" }, "exchangeRate": { - "message": "Exchange Rate" + "message": "교환비율" }, "exportPrivateKey": { - "message": "Export Private Key" + "message": "비밀키 내보내기" }, "exportPrivateKeyWarning": { "message": "Export private keys at your own risk." @@ -216,56 +216,56 @@ "description": "Exchange type" }, "fileImportFail": { - "message": "File import not working? Click here!", + "message": "파일을 가져올 수 없나요? 여기를 클릭해주세요!", "description": "Helps user import their account from a JSON file" }, "from": { - "message": "From" + "message": "보내는 사람" }, "fromShapeShift": { - "message": "From ShapeShift" + "message": "ShapeShift로 부터" }, "gas": { - "message": "Gas", + "message": "가스", "description": "Short indication of gas cost" }, "gasFee": { "message": "가스 수수료" }, "gasLimit": { - "message": "Gas Limit" + "message": "가스 리밋" }, "gasLimitCalculation": { - "message": "We calculate the suggested gas limit based on network success rates." + "message": "네트워크 성공률을 기반으로 적합한 가스 리밋을 계산합니다." }, "gasLimitRequired": { - "message": "Gas Limit Required" + "message": "가스 리밋이 필요합니다." }, "gasLimitTooLow": { - "message": "Gas limit must be at least 21000" + "message": "가스 리밋은 21000 이상이여야 합니다." }, "gasPrice": { - "message": "Gas Price (GWEI)" + "message": "가스 가격 (GWEI)" }, "gasPriceCalculation": { - "message": "We calculate the suggested gas prices based on network success rates." + "message": "네트워크 성공률을 기반으로 적합한 가스 가격을 계산합니다." }, "gasPriceRequired": { - "message": "Gas Price Required" + "message": "가스 가격이 필요합니다." }, "getEther": { "message": "이더리움 얻기" }, "getEtherFromFaucet": { - "message": "Get Ether from a faucet for the $1", + "message": "faucet에서 1달러에 달하는 이더리움을 얻으세요.", "description": "Displays network name for Ether faucet" }, "greaterThanMin": { - "message": "must be greater than or equal to $1.", + "message": "1 달러 이상이어야 합니다.", "description": "helper for inputting hex as decimal input" }, "here": { - "message": "here", + "message": "여기", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hide": { @@ -275,56 +275,56 @@ "message": "토큰 숨기기" }, "hideTokenPrompt": { - "message": "Hide Token?" + "message": "토큰 숨기기?" }, "howToDeposit": { - "message": "How would you like to deposit Ether?" + "message": "어떤 방법으로 이더리움을 입금하시겠습니까?" }, "import": { - "message": "Import", + "message": "파일에서 가져오기", "description": "Button to import an account from a selected file" }, "importAccount": { - "message": "Import Account" + "message": "계좌 가져오기" }, "importAnAccount": { - "message": "Import an account" + "message": "계좌 가져오기" }, "importDen": { - "message": "Import Existing DEN" + "message": "기존 DEN 가져오기" }, "imported": { - "message": "Imported", + "message": "가져오기 완료", "description": "status showing that an account has been fully loaded into the keyring" }, "infoHelp": { - "message": "Info & Help" + "message": "정보 및 도움말" }, "invalidAddress": { - "message": "Invalid address" + "message": "유효하지 않은 주소" }, "invalidGasParams": { - "message": "Invalid Gas Parameters" + "message": "유효하지 않은 가스 입력값" }, "invalidInput": { - "message": "Invalid input." + "message": "유효하지 않은 입력값" }, "invalidRequest": { - "message": "Invalid Request" + "message": "유효하지 않은 요청" }, "jsonFile": { - "message": "JSON File", + "message": "JSON 파일", "description": "format for importing an account" }, "kovan": { "message": "Kovan 테스트넷" }, "lessThanMax": { - "message": "must be less than or equal to $1.", + "message": "1달러 이하여야합니다.", "description": "helper for inputting hex as decimal input" }, "limit": { - "message": "Limit" + "message": "리밋" }, "loading": { "message": "로딩중..." @@ -339,7 +339,7 @@ "message": "로그아웃" }, "loose": { - "message": "Loose" + "message": "외부 비밀키" }, "mainnet": { "message": "이더리움 메인넷" @@ -354,24 +354,24 @@ "message": "내 계좌" }, "needEtherInWallet": { - "message": "To interact with decentralized applications using MetaMask, you’ll need Ether in your wallet." + "message": "dApp을 이용하기 위해서는 지갑에 이더리움이 있어야 합니다." }, "needImportFile": { - "message": "You must select a file to import.", + "message": "가져올 파일을 선택해주세요.", "description": "User is important an account and needs to add a file to continue" }, "needImportPassword": { - "message": "You must enter a password for the selected file.", + "message": "선택 된 파일에 패스워드를 입력해주세요.", "description": "Password and file needed to import an account" }, "networks": { - "message": "Networks" + "message": "네트워크" }, "newAccount": { - "message": "New Account" + "message": "새 계좌" }, "newAccountNumberName": { - "message": "Account $1", + "message": "새 계좌 $1", "description": "Default name of next account to be created on create account screen" }, "newContract": { @@ -381,16 +381,16 @@ "message": "새 패스워드 (최소 8자 이상)" }, "newRecipient": { - "message": "New Recipient" + "message": "받는 사람" }, "next": { "message": "다음" }, "noAddressForName": { - "message": "No address has been set for this name." + "message": "이 이름에는 주소가 설정되어 있지 않습니다." }, "noDeposits": { - "message": "No deposits received" + "message": "입금이 없습니다." }, "noTransactionHistory": { "message": "트랜잭션 기록이 없습니다." @@ -399,75 +399,75 @@ "message": "트랜잭션이 없습니다." }, "notStarted": { - "message": "Not Started" + "message": "시작되지 않음." }, "oldUI": { - "message": "Old UI" + "message": "구버전의 UI" }, "oldUIMessage": { - "message": "You have returned to the old UI. You can switch back to the New UI through the option in the top right dropdown menu." + "message": "구버전 UI로 변경하셨습니다. 우 상단 드랍다운 메뉴에서 새 UI로 변경하실 수 있습니다." }, "or": { - "message": "or", + "message": "또는", "description": "choice between creating or importing a new account" }, "passwordMismatch": { - "message": "passwords don't match", + "message": "패스워드가 일치하지 않습니다.", "description": "in password creation process, the two new password fields did not match" }, "passwordShort": { - "message": "password not long enough", + "message": "패스워드가 너무 짧습니다.", "description": "in password creation process, the password is not long enough to be secure" }, "pastePrivateKey": { - "message": "Paste your private key string here:", + "message": "비밀키 스트링을 붙여넣어주세요.", "description": "For importing an account from a private key" }, "pasteSeed": { - "message": "Paste your seed phrase here!" + "message": "시드 문장들을 붙여넣어주세요." }, "pleaseReviewTransaction": { - "message": "Please review your transaction." + "message": "트랜잭션을 검토해주세요." }, "privateKey": { - "message": "Private Key", + "message": "비밀키", "description": "select this type of file to use to import an account" }, "privateKeyWarning": { - "message": "Warning: Never disclose this key. Anyone with your private keys can take steal any assets held in your account." + "message": " 절대 이 키를 노출하지 마십시오. 비밀키가 노출되면 누구나 당신의 계좌에서 자산을 빼갈 수 있습니다." }, "privateNetwork": { - "message": "Private Network" + "message": "프라이빗 네트워크" }, "qrCode": { "message": "QR 코드 보기" }, "readdToken": { - "message": "You can add this token back in the future by going go to “Add token” in your accounts options menu." + "message": "옵션 메뉴에서 “토큰 추가”를 눌러서 추후에 다시 이 토큰을 추가하실 수 있습니다." }, "readMore": { "message": "더 읽기." }, "receive": { - "message": "Receive" + "message": "받기" }, "recipientAddress": { - "message": "Recipient Address" + "message": "받는 사람 주소" }, "refundAddress": { - "message": "Your Refund Address" + "message": "환불받을 주소" }, "rejected": { - "message": "Rejected" + "message": "거부되었음." }, "required": { - "message": "Required" + "message": "필요함." }, "retryWithMoreGas": { - "message": "Retry with a higher gas price here" + "message": "더 높은 가스 가격으로 다시 시도해주세요." }, "revert": { - "message": "Revert" + "message": "취소" }, "rinkeby": { "message": "Rinkeby 테스트넷" @@ -476,18 +476,18 @@ "message": "Ropsten 테스트넷" }, "sampleAccountName": { - "message": "E.g. My new account", + "message": "예) 나의 새 계좌", "description": "Help user understand concept of adding a human-readable name to their account" }, "save": { - "message": "Save" + "message": "저장" }, "saveAsFile": { - "message": "Save as File", + "message": "파일로 저장", "description": "Account export process" }, "selectService": { - "message": "Select Service" + "message": "서비스 선택" }, "send": { "message": "전송" @@ -496,114 +496,114 @@ "message": "토큰 전송" }, "sendTokensAnywhere": { - "message": "Send Tokens to anyone with an Ethereum account" + "message": "이더리움 계좌로 토큰 전송" }, "settings": { "message": "설정" }, "shapeshiftBuy": { - "message": "Buy with Shapeshift" + "message": "Shapeshift를 통해서 구매하기" }, "showPrivateKeys": { - "message": "Show Private Keys" + "message": "비밀키 보기" }, "showQRCode": { "message": "QR코드 보기" }, "sign": { - "message": "Sign" + "message": "서명" }, "signMessage": { - "message": "Sign Message" + "message": "서명 메시지" }, "signNotice": { - "message": "Signing this message can have \ndangerous side effects. Only sign messages from \nsites you fully trust with your entire account.\n This dangerous method will be removed in a future version. " + "message": "이 메시지에 대한 서명은 위험할 수 있습니다.\n 완전히 신뢰할 수 있는 사이트에서만 서명해주세요.\n 안전을 위해 추후의 버전에서는 삭제될 기능입니다. " }, "sigRequest": { - "message": "Signature Request" + "message": "서명 요청" }, "sigRequested": { - "message": "Signature Requested" + "message": "서명이 요청되었습니다." }, "status": { - "message": "Status" + "message": "상태" }, "submit": { - "message": "Submit" + "message": "제출" }, "takesTooLong": { - "message": "Taking too long?" + "message": "너무 오래걸리나요?" }, "testFaucet": { - "message": "Test Faucet" + "message": "Faucet 테스트" }, "to": { - "message": "To" + "message": "대상" }, "toETHviaShapeShift": { - "message": "$1 to ETH via ShapeShift", + "message": "ShapeShift를 통해 1 달러를 ETH로 바꾸기", "description": "system will fill in deposit type in start of message" }, "tokenBalance": { - "message": "Your Token Balance is:" + "message": "현재 토큰 잔액: " }, "total": { - "message": "Total" + "message": "합계" }, "transactionMemo": { - "message": "Transaction memo (optional)" + "message": "트랜잭션 메모 (선택사항)" }, "transactionNumber": { - "message": "Transaction Number" + "message": "트랜잭션 번호" }, "transfers": { - "message": "Transfers" + "message": "전송" }, "troubleTokenBalances": { - "message": "We had trouble loading your token balances. You can view them ", + "message": "토큰 잔액을 가져오는데에 문제가 생겼습니다. (여기)서 상세내용을 볼 수 있습니다.", "description": "Followed by a link (here) to view token balances" }, "typePassword": { - "message": "Type Your Password" + "message": "패스워드를 입력하세요." }, "uiWelcome": { - "message": "Welcome to the New UI (Beta)" + "message": "새 UI에 오신 것을 환영합니다. (베타)" }, "uiWelcomeMessage": { - "message": "You are now using the new Metamask UI. Take a look around, try out new features like sending tokens, and let us know if you have any issues." + "message": "새 메타마스크 UI를 사용하고 계십니다. 토큰 전송과 같은 새 기능들을 사용해보시면서 문제가 있다면 알려주세요." }, "unavailable": { - "message": "Unavailable" + "message": "유효하지 않은" }, "unknown": { - "message": "Unknown" + "message": "알려지지 않은" }, "unknownNetwork": { - "message": "Unknown Private Network" + "message": "알려지지 않은 프라이빗 네트워크" }, "unknownNetworkId": { - "message": "Unknown network ID" + "message": "알려지지 않은 네트워크 ID" }, "usaOnly": { - "message": "USA only", + "message": "USA 거주자 한정", "description": "Using this exchange is limited to people inside the USA" }, "usedByClients": { - "message": "Used by a variety of different clients" + "message": "다양한 클라이언트에서 사용되고 있습니다." }, "viewAccount": { - "message": "View Account" + "message": "계좌 보기" }, "warning": { - "message": "Warning" + "message": "경고" }, "whatsThis": { - "message": "What's this?" + "message": "이것은 무엇인가요?" }, "yourSigRequested": { - "message": "Your signature is being requested" + "message": "서명이 요청되고 있습니다." }, "youSign": { - "message": "You are signing" + "message": "서명 중입니다." } } -- cgit From d2d0e2324bc94907d4c2dc5265294ffb42e3c48e Mon Sep 17 00:00:00 2001 From: Marvin Vista Date: Thu, 15 Mar 2018 14:58:26 +0800 Subject: Translate to Tagalog #3535 --- app/_locales/ph/messages.json | 609 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 609 insertions(+) create mode 100644 app/_locales/ph/messages.json diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json new file mode 100644 index 000000000..f91c6373e --- /dev/null +++ b/app/_locales/ph/messages.json @@ -0,0 +1,609 @@ +{ + "accept": { + "message": "Tanggapin" + }, + "account": { + "message": "Account" + }, + "accountDetails": { + "message": "Detalye ng Account" + }, + "accountName": { + "message": "Pangalan ng Account" + }, + "address": { + "message": "Address" + }, + "addToken": { + "message": "Magdagdag ng Token" + }, + "amount": { + "message": "Halaga" + }, + "amountPlusGas": { + "message": "Halaga + Gas" + }, + "appDescription": { + "message": "Ethereum Browser Extension", + "description": "Ang deskripsyon ng application" + }, + "appName": { + "message": "MetaMask", + "description": "Ang pangalan ng application" + }, + "attemptingConnect": { + "message": "Sinusubukang kumonekta sa blockchain." + }, + "available": { + "message": "Magagamit" + }, + "back": { + "message": "Bumalik" + }, + "balance": { + "message": "Balanse:" + }, + "balanceIsInsufficientGas": { + "message": "Kulang ang balanse para sa kasalukuyang gas total" + }, + "beta": { + "message": "BETA" + }, + "betweenMinAndMax": { + "message": "dapat mas malaki o katumbas ng $1 at mas mababa o katumbas ng $2.", + "description": "helper para sa pag-input ng hex bilang decimal input" + }, + "borrowDharma": { + "message": "Humiram sa Dharma (Beta)" + }, + "buy": { + "message": "Bumili" + }, + "buyCoinbase": { + "message": "Bumili sa Coinbase" + }, + "buyCoinbaseExplainer": { + "message": "Ang Coinbase ang pinakasikat na paraan upang bumili at magbenta ng bitcoin, ethereum, at litecoin sa buong mundo." + }, + "cancel": { + "message": "Kanselahin" + }, + "clickCopy": { + "message": "I-click upang Makopya" + }, + "confirm": { + "message": "Tiyakin" + }, + "confirmContract": { + "message": "Tiyakin ang Contract" + }, + "confirmPassword": { + "message": "Tiyakin ang Password" + }, + "confirmTransaction": { + "message": "Tiyakin ang Transaksyon" + }, + "continueToCoinbase": { + "message": "Magpatuloy sa Coinbase" + }, + "contractDeployment": { + "message": "Pag-deploy ng Contract" + }, + "conversionProgress": { + "message": "Isinasagawa ang conversion" + }, + "copiedButton": { + "message": "Kinopya" + }, + "copiedClipboard": { + "message": "Kinopya sa Clipboard" + }, + "copiedExclamation": { + "message": "Kinopya!" + }, + "copy": { + "message": "Kinopya" + }, + "copyToClipboard": { + "message": "Kinopya sa clipboard" + }, + "copyButton": { + "message": " Kinopya " + }, + "copyPrivateKey": { + "message": "Ito ang iyong private key (i-click upang makopya)" + }, + "create": { + "message": "Gumawa" + }, + "createAccount": { + "message": "Gumawa ng Account" + }, + "createDen": { + "message": "Gumawa" + }, + "crypto": { + "message": "Crypto", + "description": "Type ng exchange (cryptocurrencies)" + }, + "customGas": { + "message": "I-customize ang Gas" + }, + "customize": { + "message": "I-customize" + }, + "customRPC": { + "message": "Custom RPC" + }, + "defaultNetwork": { + "message": "Ang default network para sa Ether transactions ay ang Main Net." + }, + "denExplainer": { + "message": "Ang iyong DEN ang nagsisilbing password-encrypted storage mo sa loob ng MetaMask." + }, + "deposit": { + "message": "Deposito" + }, + "depositBTC": { + "message": "I-deposito ang iyong BTC sa address na ito:" + }, + "depositCoin": { + "message": "I-deposito ang iyong $1 sa address na ito", + "description": "Sinasabihan ang user kung ano ang coin na kanilang pinili para I-deposito gamit ang shapeshift" + }, + "depositEth": { + "message": "I-deposito ang Eth" + }, + "depositEther": { + "message": "I-deposito ang Ether" + }, + "depositFiat": { + "message": "I-deposito ang Fiat" + }, + "depositFromAccount": { + "message": "I-deposito mula sa ibang account" + }, + "depositShapeShift": { + "message": "I-deposito gamit ang ShapeShift" + }, + "depositShapeShiftExplainer": { + "message": "Kung ikaw ay nagmamay-ari ng iba pang cryptocurrencies, pwede kang mag-trade at mag-deposito ng Ether diretso sa iyong MetaMask wallet. Hindi mo na kailangan ng account." + }, + "details": { + "message": "Detalye" + }, + "directDeposit": { + "message": "Direktang Deposito" + }, + "directDepositEther": { + "message": "Direktang I-deposito ang Ether" + }, + "directDepositEtherExplainer": { + "message": "Kung ika ay mayroon nang Ether, ang pinakamabilis na paraan upang makuha ang Ether sa iyong bagong wallet ay sa pamamagitan ng direktang deposito." + }, + "done": { + "message": "Tapos na" + }, + "edit": { + "message": "I-edit" + }, + "editAccountName": { + "message": "I-edit ang Pangalang ng Account" + }, + "encryptNewDen": { + "message": "I-encrypt ang iyong bagong DEN" + }, + "enterPassword": { + "message": "I-enter ang password" + }, + "etherscanView": { + "message": "Tingnan ang account sa Etherscan" + }, + "exchangeRate": { + "message": "Exchange Rate" + }, + "exportPrivateKey": { + "message": "I-export ang Private Key" + }, + "exportPrivateKeyWarning": { + "message": "I-export ang private keys at intindihin ang panganib na kasama nito." + }, + "failed": { + "message": "Nabigo" + }, + "fiat": { + "message": "FIAT", + "description": "Type ng exchange" + }, + "fileImportFail": { + "message": "Hindi gumagana ang file import? I-click ito!", + "description": "Tinutulungan ang user na i-import ang kanilang account mula sa JSON file" + }, + "from": { + "message": "Mula sa" + }, + "fromShapeShift": { + "message": "Mula sa ShapeShift" + }, + "gas": { + "message": "Gas", + "description": "Maikling indikasyon ng gas cost" + }, + "gasFee": { + "message": "Gas Fee" + }, + "gasLimit": { + "message": "Gas Limit" + }, + "gasLimitCalculation": { + "message": "Kinalkula namin ang iminungkahing gas limit base sa network success rates." + }, + "gasLimitRequired": { + "message": "Kailangan ang Gas Limit" + }, + "gasLimitTooLow": { + "message": "Ang gas limit ay hindi dabat bababa sa 21000" + }, + "gasPrice": { + "message": "Gas Price (GWEI)" + }, + "gasPriceCalculation": { + "message": "Kinalkula namin ang iminungkahing gas prices base sa network success rates." + }, + "gasPriceRequired": { + "message": "Kailangan ang Gas Price" + }, + "getEther": { + "message": "Kumuha ng Ether" + }, + "getEtherFromFaucet": { + "message": "Kumuha ng Ether mula sa faucet para sa $1", + "description": "Ipinapakita ang pangalan ng network para sa Ether faucet" + }, + "greaterThanMin": { + "message": "dapat mas malaki o katumbas ng $1.", + "description": "helper para sa pag-input ng hex bilang decimal input" + }, + "here": { + "message": "i-click ito", + "description": "tulad ng -i-click dito- para sa mas maraming impormasyon (kasama ng troubleTokenBalances)" + }, + "hide": { + "message": "Itago" + }, + "hideToken": { + "message": "Itago ang Token" + }, + "hideTokenPrompt": { + "message": "Itago ang Token?" + }, + "howToDeposit": { + "message": "Paano mo gustong mag-deposito ng Ether?" + }, + "import": { + "message": "I-import", + "description": "Button para i-import ang account mula sa napiling file" + }, + "importAccount": { + "message": "I-import ang Account" + }, + "importAnAccount": { + "message": "I-import ang account" + }, + "importDen": { + "message": "I-import ang Existing DEN" + }, + "imported": { + "message": "Na-import na", + "description": "status na nagpapakita na ang account ay lubos na na-load sa keyring" + }, + "infoHelp": { + "message": "Impormasyon at Tulong" + }, + "invalidAddress": { + "message": "Invalid ang address" + }, + "invalidGasParams": { + "message": "Invalid ang Gas Parameters" + }, + "invalidInput": { + "message": "Invalid ang input." + }, + "invalidRequest": { + "message": "Invalid ang Request" + }, + "jsonFile": { + "message": "JSON File", + "description": "format para sa pag-import ng account" + }, + "kovan": { + "message": "Kovan Test Network" + }, + "lessThanMax": { + "message": "dapat mas mababa o katumbas ng $1.", + "description": "helper para sa pag-input ng hex bilang decimal input" + }, + "limit": { + "message": "Limitasyon" + }, + "loading": { + "message": "Naglo-load..." + }, + "loadingTokens": { + "message": "Naglo-load ang Tokens..." + }, + "localhost": { + "message": "Localhost 8545" + }, + "logout": { + "message": "Log out" + }, + "loose": { + "message": "Loose" + }, + "mainnet": { + "message": "Main Ethereum Network" + }, + "message": { + "message": "Mensahe" + }, + "min": { + "message": "Minimum" + }, + "myAccounts": { + "message": "Aking mga Account" + }, + "needEtherInWallet": { + "message": "Upang makipag-ugnayan sa decentralized applications gamit ang MetaMask, kakailanganin mo ng Ether sa iyong wallet." + }, + "needImportFile": { + "message": "Dapat kang pumili ng file para i-import.", + "description": "Ang user ay nag-iimport ng account at kailangan magdagdag ng file upang tumuloy" + }, + "needImportPassword": { + "message": "Dapat mong i-enter ang password para sa napiling file.", + "description": "Password at file na kailangan upang ma-import ang account" + }, + "networks": { + "message": "Networks" + }, + "newAccount": { + "message": "Bagong Account" + }, + "newAccountNumberName": { + "message": "Account $1", + "description": "Ang default na pangalan ng susunod na account na gagawin sa create account screen" + }, + "newContract": { + "message": "Bagong Contract" + }, + "newPassword": { + "message": "Bagong Password (min 8 chars)" + }, + "newRecipient": { + "message": "Bagong Recipient" + }, + "next": { + "message": "Sunod" + }, + "noAddressForName": { + "message": "Walang naka-set na address para sa pangalang ito." + }, + "noDeposits": { + "message": "Walang natanggap na mga deposito" + }, + "noTransactionHistory": { + "message": "Walang kasaysayan ng transaksyon." + }, + "noTransactions": { + "message": "Walang mga Transaksyon" + }, + "notStarted": { + "message": "Hindi Sinimulan" + }, + "oldUI": { + "message": "Lumang UI" + }, + "oldUIMessage": { + "message": "Ikaw ay bumalik sa lumang UI. Maaari kang bumalik sa bagong UI mula sa isang opsyon sa dropdown menu na matatagpuan sa bandang taas at kanan." + }, + "or": { + "message": "o", + "description": "Pagpili sa pagitan ng paggawa of pag-import ng bagong account" + }, + "passwordMismatch": { + "message": "hindi nagtugma ang mga password", + "description": "Sa proseso ng paggawa ng password, ang dalawang password fields ay hindi nagtugma" + }, + "passwordShort": { + "message": "hindi sapat ang haba ng password", + "description": "Sa proseso ng paggawa ng password, ang password ay hindi in password creation process, hind sapat ang haba ng password upang maging ligtas" + }, + "pastePrivateKey": { + "message": "I-paste dito ang iyong private key string:", + "description": "Para sa pag-import ng account mula sa private key" + }, + "pasteSeed": { + "message": "I-paste dito ang iyong seed phrase!" + }, + "pleaseReviewTransaction": { + "message": "Mangyaring suriin ang iyong transaksyon." + }, + "privateKey": { + "message": "Private Key", + "description": "Piliin ang ganitong type ng file upang gamitin sa pag-import ng account" + }, + "privateKeyWarning": { + "message": "Babala: Huwag sabihin sa kahit na sino ang key na ito. Maaring makuha at manakaw ng sinumang nakakaalam ng iyong private key ang mga assets sa iyong account." + }, + "privateNetwork": { + "message": "Pribadong Network" + }, + "qrCode": { + "message": "Ipakita ang QR Code" + }, + "readdToken": { + "message": "Upang muling idagdag ang token na ito, pumunta sa "Magdagdag ng Token" sa options menu ng iyong account." + }, + "readMore": { + "message": "Alamin ang iba pang impormasyon dito." + }, + "receive": { + "message": "Tanggapin" + }, + "recipientAddress": { + "message": "Address ng Tatanggap" + }, + "refundAddress": { + "message": "Ang Iyong Refund Address" + }, + "rejected": { + "message": "Tinanggihan" + }, + "required": { + "message": "Kailangan" + }, + "retryWithMoreGas": { + "message": "Muling subukan ng may mas mataas na gas price dito" + }, + "revert": { + "message": "Ibalik" + }, + "rinkeby": { + "message": "Rinkeby Test Network" + }, + "ropsten": { + "message": "Ropsten Test Network" + }, + "sampleAccountName": { + "message": "Halimbawa: Ang aking bagong account", + "description": "Tulungan ang user na intindihin ang konsepto ng pagdagdag ng human-readable name sa kanilang account" + }, + "save": { + "message": "I-save" + }, + "saveAsFile": { + "message": "I-save bilang File", + "description": "Proseso sa pag-export ng Account" + }, + "selectService": { + "message": "Piliin ang Service" + }, + "send": { + "message": "Magpadala" + }, + "sendTokens": { + "message": "Magpadala ng Tokens" + }, + "sendTokensAnywhere": { + "message": "Magpadala ng Tokens sa sinumang may Ethereum account" + }, + "settings": { + "message": "Mga Setting" + }, + "shapeshiftBuy": { + "message": "Bumili gamit ang Shapeshift" + }, + "showPrivateKeys": { + "message": "Ipakita ang Private Keys" + }, + "showQRCode": { + "message": "Ipakita ang QR Code" + }, + "sign": { + "message": "I-sign" + }, + "signMessage": { + "message": "I-sign ang mensahe" + }, + "signNotice": { + "message": "Ang pag-sign ng mensaheng ito ay maaring magdulot ng mapanganib na epekto. I-sign lamang ang mga mensahe mula sa mga site na pinagkakatiwalaan mo ng iyong account. Ang mapanganib na paraang ito ay aalisin sa isa sa mga susunod na bersyon. " + }, + "sigRequest": { + "message": "Hiling na Signature" + }, + "sigRequested": { + "message": "Hiniling ang Signature" + }, + "status": { + "message": "Istado" + }, + "submit": { + "message": "I-submit" + }, + "takesTooLong": { + "message": "Masyadong matagal?" + }, + "testFaucet": { + "message": "Test Faucet" + }, + "to": { + "message": "To" + }, + "toETHviaShapeShift": { + "message": "$1 sa ETH sa pamamagitan ng ShapeShift", + "description": "Pupunan ng system ang deposit type sa simula ng mensahe" + }, + "tokenBalance": { + "message": "Ang iyong Token Balance ay:" + }, + "total": { + "message": "Kabuuan" + }, + "transactionMemo": { + "message": "Memo ng transaksyon (opsyonal)" + }, + "transactionNumber": { + "message": "Numero ng Transaksyon" + }, + "transfers": { + "message": "Mga Inilipat" + }, + "troubleTokenBalances": { + "message": "Nagkaroon kami ng problema sa paglo-load ng iyong mga balanseng token. Tingnan ito dito ", + "description": "Susundan ng link (dito) para tingnan ang token balances" + }, + "typePassword": { + "message": "I-type ang iyong Password" + }, + "uiWelcome": { + "message": "Maligayang pagdating sa Bagong UI (Beta)" + }, + "uiWelcomeMessage": { + "message": "Ginagamit mo na ngayon ang bagong MetaMask UI. I-explore at subukan ang mga bagong features tulad ng pagpapadala ng mga token, at ipaalam sa amin kung mayroon kang anumang mga isyu." + }, + "unavailable": { + "message": "Hindi Magagamit" + }, + "unknown": { + "message": "Hindi Alam" + }, + "unknownNetwork": { + "message": "Hindi Alam ang Pribadong Network" + }, + "unknownNetworkId": { + "message": "Hindi alam ang network ID" + }, + "usaOnly": { + "message": "USA lamang", + "description": "Ang paggamit ng exchange na ito ay limitado sa mga tao sa loob ng Estados Unidos" + }, + "usedByClients": { + "message": "Ginagamit ng iba't ibang mga clients" + }, + "viewAccount": { + "message": "Tingnan ang Account" + }, + "warning": { + "message": "Babala" + }, + "whatsThis": { + "message": "Ano ito?" + }, + "yourSigRequested": { + "message": "Hinihiling ang iyong signature" + }, + "youSign": { + "message": "Ikaw ay nagsa-sign" + } +} -- cgit From dff09cf95df3f817f6a8bcdc9611f8249a34d16d Mon Sep 17 00:00:00 2001 From: Marvin Vista Date: Thu, 15 Mar 2018 15:02:36 +0800 Subject: Translate to Tagalog #3535 Changed some special characters --- app/_locales/ph/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index f91c6373e..29d63be02 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -443,7 +443,7 @@ "message": "Ipakita ang QR Code" }, "readdToken": { - "message": "Upang muling idagdag ang token na ito, pumunta sa "Magdagdag ng Token" sa options menu ng iyong account." + "message": "Upang muling idagdag ang token na ito, pumunta sa “Magdagdag ng Token” sa options menu ng iyong account." }, "readMore": { "message": "Alamin ang iba pang impormasyon dito." -- cgit From 09fe5ed9bae755c6d28f7ad5422bce9f9810ecd6 Mon Sep 17 00:00:00 2001 From: simon fourdinier Date: Thu, 15 Mar 2018 09:37:00 +0100 Subject: fix plural in french translation --- app/_locales/fr/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 7edbd41ab..da2cfe4f8 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -149,7 +149,7 @@ }, "depositCoin": { "message": "Déposez votre $1 à l'adresse ci-dessous", - "description": "Indique à l'utilisateur quelle monnaie ils a choisi de déposer avec shapeshift" + "description": "Indique à l'utilisateur quelle monnaie il a choisi de déposer avec shapeshift" }, "depositEth": { "message": "Dépôt Eth" -- cgit From 66193c823cdbb9474cbc3ed9e1c4ab7a28b9b230 Mon Sep 17 00:00:00 2001 From: Alexander Tseung Date: Thu, 15 Mar 2018 09:20:22 -0700 Subject: Update Deposit Eth icon (#3569) --- app/images/deposit-eth.svg | 32 ++ ui/app/components/modals/deposit-ether-modal.js | 10 +- ui/app/css/itcss/components/modal.scss | 10 - yarn.lock | 668 ++++++++---------------- 4 files changed, 260 insertions(+), 460 deletions(-) create mode 100644 app/images/deposit-eth.svg diff --git a/app/images/deposit-eth.svg b/app/images/deposit-eth.svg new file mode 100644 index 000000000..a2c69242e --- /dev/null +++ b/app/images/deposit-eth.svg @@ -0,0 +1,32 @@ + + + + deposit-eth + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/app/components/modals/deposit-ether-modal.js b/ui/app/components/modals/deposit-ether-modal.js index 26ff3ea03..23e8666af 100644 --- a/ui/app/components/modals/deposit-ether-modal.js +++ b/ui/app/components/modals/deposit-ether-modal.js @@ -128,13 +128,15 @@ DepositEtherModal.prototype.render = function () { }), ]), - + h('.page-container__content', {}, [ - + h('div.deposit-ether-modal__buy-rows', [ this.renderRow({ - logo: h('img.deposit-ether-modal__buy-row__eth-logo', { src: '../../../images/eth_logo.svg' }), + logo: h('img.deposit-ether-modal__logo', { + src: '../../../images/deposit-eth.svg', + }), title: DIRECT_DEPOSIT_ROW_TITLE, text: DIRECT_DEPOSIT_ROW_TEXT, buttonLabel: t('viewAccount'), @@ -164,7 +166,7 @@ DepositEtherModal.prototype.render = function () { onButtonClick: () => toCoinbase(address), hide: isTestNetwork || buyingWithShapeshift, }), - + this.renderRow({ logo: h('div.deposit-ether-modal__logo', { style: { diff --git a/ui/app/css/itcss/components/modal.scss b/ui/app/css/itcss/components/modal.scss index 6c4106f8b..a8d5e8dc2 100644 --- a/ui/app/css/itcss/components/modal.scss +++ b/ui/app/css/itcss/components/modal.scss @@ -725,16 +725,6 @@ height: 60px; } - &__eth-logo { - border-radius: 50%; - height: 68px; - width: 68px; - border: 3px solid $tundora; - z-index: 25; - padding: 4px; - background-color: #fff; - } - &__right { display: flex; } diff --git a/yarn.lock b/yarn.lock index 888175c92..7512e10db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -155,6 +155,13 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn-node@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.3.0.tgz#5f86d73346743810ef1269b901dbcbded020861b" + dependencies: + acorn "^5.4.1" + xtend "^4.0.1" + acorn@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.1.2, acorn@^5.2.1: version "5.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" @@ -167,6 +174,10 @@ acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" +acorn@^5.4.1: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" + addressparser@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746" @@ -278,6 +289,12 @@ ansi-styles@^3.1.0: dependencies: color-convert "^1.9.0" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -409,10 +426,6 @@ array-initial@^1.0.0: array-slice "^1.0.0" is-number "^4.0.0" -array-iterate@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-iterate/-/array-iterate-1.1.1.tgz#865bf7f8af39d6b0982c60902914ac76bc0108f6" - array-last@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" @@ -623,15 +636,15 @@ autoprefixer@^6.0.0: postcss "^5.2.16" postcss-value-parser "^3.2.3" -autoprefixer@^7.0.0, autoprefixer@^7.1.2: - version "7.2.3" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.3.tgz#c2841e38b7940c2d0a9bbffd72c75f33637854f8" +autoprefixer@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.1.0.tgz#374cf35be1c0e8fce97408d876f95f66f5cb4641" dependencies: - browserslist "^2.10.0" - caniuse-lite "^1.0.30000783" + browserslist "^3.1.1" + caniuse-lite "^1.0.30000810" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^6.0.14" + postcss "^6.0.19" postcss-value-parser "^3.2.3" await-semaphore@^0.1.1: @@ -1853,7 +1866,7 @@ browserify-zlib@^0.2.0, browserify-zlib@~0.2.0: dependencies: pako "~1.0.5" -browserify@^14.0.0, browserify@^14.4.0, browserify@^14.5.0: +browserify@^14.0.0, browserify@^14.5.0: version "14.5.0" resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.5.0.tgz#0bbbce521acd6e4d1d54d8e9365008efb85a9cc5" dependencies: @@ -1905,6 +1918,59 @@ browserify@^14.0.0, browserify@^14.4.0, browserify@^14.5.0: vm-browserify "~0.0.1" xtend "^4.0.0" +browserify@^16.1.1: + version "16.1.1" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.1.1.tgz#7905ec07e0147c4d90f92001944050a6e1c2844e" + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.2.0" + buffer "^5.0.2" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp "^0.5.0" + module-deps "^6.0.0" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^2.0.0" + string_decoder "~1.0.0" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "~0.0.1" + xtend "^4.0.0" + browserslist@^1.1.1, browserslist@^1.1.3, browserslist@^1.7.6: version "1.7.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" @@ -1912,13 +1978,20 @@ browserslist@^1.1.1, browserslist@^1.1.3, browserslist@^1.7.6: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -browserslist@^2.1.2, browserslist@^2.10.0: +browserslist@^2.1.2: version "2.10.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.10.0.tgz#bac5ee1cc69ca9d96403ffb8a3abdc5b6aed6346" dependencies: caniuse-lite "^1.0.30000780" electron-to-chromium "^1.3.28" +browserslist@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.1.2.tgz#893f29399d640ed35fe06bacd7eb1d78609a47e5" + dependencies: + caniuse-lite "^1.0.30000813" + electron-to-chromium "^1.3.36" + bs58@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d" @@ -2054,14 +2127,6 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -2082,10 +2147,14 @@ caniuse-db@^1.0.30000187, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: version "1.0.30000784" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000784.tgz#1be95012d9489c7719074f81aee57dbdffe6361b" -caniuse-lite@^1.0.30000780, caniuse-lite@^1.0.30000783: +caniuse-lite@^1.0.30000780: version "1.0.30000784" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000784.tgz#129ced74e9a1280a441880b6cd2bce30ef59e6c0" +caniuse-lite@^1.0.30000810, caniuse-lite@^1.0.30000813: + version "1.0.30000814" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000814.tgz#73eb6925ac2e54d495218f1ea0007da3940e488b" + caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -2094,10 +2163,6 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -ccount@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.2.tgz#53b6a2f815bb77b9c2871f7b9a72c3a25f1d8e89" - center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" @@ -2156,14 +2221,18 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chalk@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + change-emitter@^0.1.2: version "0.1.6" resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" -character-entities-html4@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.1.tgz#359a2a4a0f7e29d3dc2ac99bdbe21ee39438ea50" - character-entities-legacy@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz#f40779df1a101872bb510a3d295e1fccf147202f" @@ -2679,15 +2748,6 @@ cosmiconfig@^2.1.1: parse-json "^2.2.0" require-from-string "^1.1.0" -cosmiconfig@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-3.1.0.tgz#640a94bf9847f321800403cd273af60665c73397" - dependencies: - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^3.0.0" - require-from-string "^2.0.1" - coveralls@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.0.tgz#22ef730330538080d29b8c151dc9146afde88a99" @@ -2733,6 +2793,13 @@ create-react-class@^15.6.0: loose-envify "^1.3.1" object-assign "^4.1.1" +cross-env@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.1.4.tgz#f61c14291f7cc653bb86457002ea80a04699d022" + dependencies: + cross-spawn "^5.1.0" + is-windows "^1.0.0" + cross-spawn@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" @@ -2869,10 +2936,6 @@ cycle@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - d3@^3.4.3: version "3.5.17" resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" @@ -2905,6 +2968,14 @@ dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" +debounce-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/debounce-stream/-/debounce-stream-2.0.0.tgz#1e33400ccff015abd8ec330661a562b68410b08f" + dependencies: + debounce "^1.0.0" + duplexer "^0.1.1" + through "^2.3.6" + debounce@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.1.0.tgz#6a1a4ee2a9dc4b7c24bb012558dbcdb05b37f408" @@ -2939,20 +3010,13 @@ debug@2.3.3: dependencies: ms "0.7.2" -debug@3.1.0, debug@3.X, debug@^3.0.0, debug@^3.0.1, debug@^3.1.0, debug@~3.1.0: +debug@3.1.0, debug@3.X, debug@^3.0.1, debug@^3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3172,6 +3236,14 @@ detective@^4.0.0, detective@^4.3.1: acorn "^5.2.1" defined "^1.0.0" +detective@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.1.0.tgz#7a20d89236d7b331ccea65832e7123b5551bb7cb" + dependencies: + acorn-node "^1.3.0" + defined "^1.0.0" + minimist "^1.1.1" + di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" @@ -3192,13 +3264,6 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - disc@^1.3.2: version "1.3.3" resolved "https://registry.yarnpkg.com/disc/-/disc-1.3.3.tgz#61d455180c2a115468bb85015a33e71a82fc02c2" @@ -3289,6 +3354,10 @@ domain-browser@^1.1.1, domain-browser@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" +domain-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + domelementtype@1, domelementtype@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" @@ -3325,12 +3394,6 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -dot-prop@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - dependencies: - is-obj "^1.0.0" - double-ended-queue@^2.1.0-0: version "2.1.0-0" resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" @@ -3405,6 +3468,10 @@ electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.28: dependencies: electron-releases "^2.1.0" +electron-to-chromium@^1.3.36: + version "1.3.37" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.37.tgz#4a92734e0044c8cf0b1553be57eae21a4c6e5fab" + elliptic@^6.0.0, elliptic@^6.2.3: version "6.4.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" @@ -3594,7 +3661,7 @@ errno@^0.1.3, errno@~0.1.1: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: @@ -4350,6 +4417,10 @@ events@^1.0.0, events@^1.1.1, events@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +events@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-2.0.0.tgz#cbbb56bf3ab1ac18d71c43bb32c86255062769f2" + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -4575,7 +4646,7 @@ falafel@^2.1.0: isarray "0.0.1" object-keys "^1.0.6" -fancy-log@^1.1.0: +fancy-log@^1.1.0, fancy-log@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" dependencies: @@ -4718,7 +4789,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -4891,13 +4962,6 @@ fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" @@ -5049,7 +5113,7 @@ get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" -get-stdin@^5.0.0, get-stdin@^5.0.1: +get-stdin@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" @@ -5242,17 +5306,6 @@ globby@^6.0.0, globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globby@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - globjoin@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" @@ -5271,12 +5324,6 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" -gonzales-pe@^4.0.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.3.tgz#41091703625433285e0aee3aa47829fc1fbeb6f2" - dependencies: - minimist "1.1.x" - graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -5293,12 +5340,13 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -gulp-autoprefixer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-4.0.0.tgz#e00a8c571b85d06516ac26341be90dfd9fc1eab0" +gulp-autoprefixer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-5.0.0.tgz#8237c278a69775270a1cafe7d6f101cfcd585544" dependencies: - autoprefixer "^7.0.0" - gulp-util "^3.0.0" + autoprefixer "^8.0.0" + fancy-log "^1.3.2" + plugin-error "^1.0.1" postcss "^6.0.1" through2 "^2.0.0" vinyl-sourcemaps-apply "^0.2.0" @@ -5421,17 +5469,18 @@ gulp-stylefmt@^1.1.0: stylefmt "^5.0.4" through2 "^2.0.1" -gulp-stylelint@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-stylelint/-/gulp-stylelint-4.0.0.tgz#440fa7e6c447e92644700e1e2a06a73e6e457750" +gulp-stylelint@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/gulp-stylelint/-/gulp-stylelint-7.0.0.tgz#4249dc36a983e6a2c28a449f73d9a369bb14b458" dependencies: - chalk "^2.0.1" + chalk "^2.3.0" deep-extend "^0.5.0" - gulp-util "^3.0.8" + fancy-log "^1.3.2" mkdirp "^0.5.1" + plugin-error "^1.0.1" promise "^8.0.1" + source-map "^0.5.6" strip-ansi "^4.0.0" - stylelint "^8.0.0" through2 "^2.0.3" gulp-uglify-es@^1.0.1: @@ -5601,6 +5650,10 @@ has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + has-gulplog@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" @@ -5781,7 +5834,7 @@ htmlescape@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" -htmlparser2@^3.9.1, htmlparser2@^3.9.2: +htmlparser2@^3.9.1: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" dependencies: @@ -5916,7 +5969,7 @@ iframe@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/iframe/-/iframe-1.0.0.tgz#58e74822b178a0579d09cd169640fb9537470ef5" -ignore@^3.2.0, ignore@^3.3.3, ignore@^3.3.5: +ignore@^3.2.0, ignore@^3.3.3: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" @@ -5942,10 +5995,6 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -6082,10 +6131,6 @@ is-alphabetical@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08" -is-alphanumeric@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" - is-alphanumerical@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz#dfb4aa4d1085e33bdb61c2dee9c80e9c6c19f53b" @@ -6276,10 +6321,6 @@ is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - is-odd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" @@ -6406,14 +6447,14 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is-windows@^1.0.0, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - is-word-character@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.1.tgz#5a03fa1ea91ace8a6eb0c7cd770eb86d65c8befb" @@ -6553,7 +6594,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.4.3, js-yaml@^3.6.1, js-yaml@^3.9.0, js-yaml@^3.9.1: +js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.4.3, js-yaml@^3.6.1, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: @@ -6620,10 +6661,6 @@ json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" -json-parse-better-errors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" - json-rpc-engine@^3.0.1, json-rpc-engine@^3.1.0, json-rpc-engine@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.4.0.tgz#8a1647a7f2cc7018f4802f41ec8208d281f78bfc" @@ -6872,10 +6909,6 @@ known-css-properties@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.2.0.tgz#899c94be368e55b42d7db8d5be7d73a4a4a41454" -known-css-properties@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.5.0.tgz#6ff66943ed4a5b55657ee095779a91f4536f8084" - labeled-stream-splicer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59" @@ -7038,15 +7071,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -7275,12 +7299,6 @@ log-symbols@^1.0.0, log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -log-symbols@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.1.0.tgz#f35fa60e278832b538dc4dddcbb478a45d3e3be6" - dependencies: - chalk "^2.0.1" - log4js@^2.3.9: version "2.5.3" resolved "https://registry.yarnpkg.com/log4js/-/log4js-2.5.3.tgz#38bb7bde5e9c1c181bd75e8bc128c5cd0409caf1" @@ -7320,10 +7338,6 @@ lolex@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.1.tgz#3d2319894471ea0950ef64692ead2a5318cff362" -longest-streak@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.2.tgz#2421b6ba939a443bb9ffebf596585a50b4c38e2e" - longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -7421,10 +7435,6 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" @@ -7439,10 +7449,6 @@ markdown-escapes@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.1.tgz#1994df2d3af4811de59a6714934c2b2292734518" -markdown-table@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.1.tgz#4b3dd3a133d1518b8ef0dbc709bf2a1b4824bc8c" - matchdep@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" @@ -7458,7 +7464,7 @@ matcher-collection@^1.0.0: dependencies: minimatch "^3.0.2" -mathml-tag-names@^2.0.0, mathml-tag-names@^2.0.1: +mathml-tag-names@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz#8d41268168bf86d1102b98109e28e531e7a34578" @@ -7479,13 +7485,6 @@ md5.js@^1.3.4: hash-base "^3.0.0" inherits "^2.0.1" -mdast-util-compact@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz#cdb5f84e2b6a2d3114df33bd05d9cb32e3c4083a" - dependencies: - unist-util-modify-children "^1.0.0" - unist-util-visit "^1.1.0" - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -7546,20 +7545,6 @@ meow@^3.3.0, meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -meow@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.0.tgz#fd5855dd008db5b92c552082db1c307cba20b29d" - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist "^1.1.3" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -7748,21 +7733,10 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@1.1.x: - version "1.1.3" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" - minimist@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" @@ -7775,21 +7749,6 @@ minimist@~0.0.1, minimist@~0.0.8: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -mississippi@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.0.tgz#d201583eb12327e3c5c1642a404a9cacf94e34f5" - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^1.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" @@ -7859,6 +7818,26 @@ module-deps@^4.0.8: through2 "^2.0.0" xtend "^4.0.0" +module-deps@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.0.0.tgz#4417b49a4f4d7af79b104186e5389ea99b1dc837" + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + cached-path-relative "^1.0.0" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.0.2" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.4.0" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -8589,14 +8568,6 @@ pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - parents@^1.0.0, parents@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" @@ -8654,19 +8625,6 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-json@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-3.0.0.tgz#fa6f47b18e23826ead32f263e744d0e1e847fb13" - dependencies: - error-ex "^1.3.1" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -8775,12 +8733,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - dependencies: - pify "^3.0.0" - pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -8917,27 +8869,13 @@ post-message-stream@^3.0.0: dependencies: readable-stream "^2.1.4" -postcss-html@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.12.0.tgz#39b6adb4005dfc5464df7999c0f81c95bced7e50" - dependencies: - htmlparser2 "^3.9.2" - remark "^8.0.0" - unist-util-find-all-after "^1.0.1" - postcss-less@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-0.14.0.tgz#c631b089c6cce422b9a10f3a958d2bedd3819324" dependencies: postcss "^5.0.21" -postcss-less@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-1.1.3.tgz#6930525271bfe38d5793d33ac09c1a546b87bb51" - dependencies: - postcss "^5.2.16" - -postcss-media-query-parser@^0.2.0, postcss-media-query-parser@^0.2.3: +postcss-media-query-parser@^0.2.0: version "0.2.3" resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" @@ -8959,44 +8897,16 @@ postcss-reporter@^3.0.0: log-symbols "^1.0.2" postcss "^5.0.0" -postcss-reporter@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-5.0.0.tgz#a14177fd1342829d291653f2786efd67110332c3" - dependencies: - chalk "^2.0.1" - lodash "^4.17.4" - log-symbols "^2.0.0" - postcss "^6.0.8" - postcss-resolve-nested-selector@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" -postcss-safe-parser@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-3.0.1.tgz#b753eff6c7c0aea5e8375fbe4cde8bf9063ff142" - dependencies: - postcss "^6.0.6" - -postcss-sass@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.2.0.tgz#e55516441e9526ba4b380a730d3a02e9eaa78c7a" - dependencies: - gonzales-pe "^4.0.3" - postcss "^6.0.6" - postcss-scss@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-0.4.1.tgz#ad771b81f0f72f5f4845d08aa60f93557653d54c" dependencies: postcss "^5.2.13" -postcss-scss@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-1.0.2.tgz#ff45cf3354b879ee89a4eb68680f46ac9bb14f94" - dependencies: - postcss "^6.0.3" - postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.1.1: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" @@ -9005,14 +8915,6 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.1.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" - dependencies: - dot-prop "^4.1.1" - indexes-of "^1.0.1" - uniq "^1.0.1" - postcss-sorting@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-2.1.0.tgz#32b1e9afa913bb225a6ad076d503d8f983bb4a82" @@ -9033,7 +8935,7 @@ postcss@^5.0.0, postcss@^5.0.18, postcss@^5.0.20, postcss@^5.0.21, postcss@^5.0. source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.1, postcss@^6.0.14, postcss@^6.0.3, postcss@^6.0.6, postcss@^6.0.8: +postcss@^6.0.1: version "6.0.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.14.tgz#5534c72114739e75d0afcf017db853099f562885" dependencies: @@ -9041,6 +8943,14 @@ postcss@^6.0.1, postcss@^6.0.14, postcss@^6.0.3, postcss@^6.0.6, postcss@^6.0.8: source-map "^0.6.1" supports-color "^4.4.0" +postcss@^6.0.19: + version "6.0.19" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.19.tgz#76a78386f670b9d9494a655bf23ac012effd1555" + dependencies: + chalk "^2.3.1" + source-map "^0.6.1" + supports-color "^5.2.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -9182,7 +9092,14 @@ pump@^1.0.0, pump@^1.0.2: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3, pumpify@^1.3.4, pumpify@^1.3.5: +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.4, pumpify@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" dependencies: @@ -9250,10 +9167,6 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - qunitjs@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/qunitjs/-/qunitjs-2.4.1.tgz#88aba055a9e2ec3dbebfaad02471b2cb002c530b" @@ -9535,13 +9448,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -9550,14 +9456,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - read@1.0.x: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -9663,13 +9561,6 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - redis-commands@^1.2.0: version "1.3.5" resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2" @@ -9779,33 +9670,6 @@ remark-parse@^4.0.0: vfile-location "^2.0.0" xtend "^4.0.1" -remark-stringify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-4.0.0.tgz#4431884c0418f112da44991b4e356cfe37facd87" - dependencies: - ccount "^1.0.0" - is-alphanumeric "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - longest-streak "^2.0.1" - markdown-escapes "^1.0.0" - markdown-table "^1.1.0" - mdast-util-compact "^1.0.0" - parse-entities "^1.0.2" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - stringify-entities "^1.0.1" - unherit "^1.0.4" - xtend "^4.0.1" - -remark@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/remark/-/remark-8.0.0.tgz#287b6df2fe1190e263c1d15e486d3fa835594d6d" - dependencies: - remark-parse "^4.0.0" - remark-stringify "^4.0.0" - unified "^6.0.0" - remove-bom-buffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" @@ -10022,10 +9886,6 @@ require-from-string@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" -require-from-string@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff" - require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -10067,10 +9927,6 @@ resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - resolve-options@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" @@ -10707,7 +10563,7 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" -specificity@^0.3.0, specificity@^0.3.1: +specificity@^0.3.0: version "0.3.2" resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.3.2.tgz#99e6511eceef0f8d9b57924937aac2cb13d13c42" @@ -10833,13 +10689,6 @@ stream-combiner@~0.0.4: dependencies: duplexer "~0.1.1" -stream-each@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - stream-exhaust@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" @@ -10924,15 +10773,6 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -stringify-entities@^1.0.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.1.tgz#b150ec2d72ac4c1b5f324b51fb6b28c9cdff058c" - dependencies: - character-entities-html4 "^1.0.0" - character-entities-legacy "^1.0.0" - is-alphanumerical "^1.0.0" - is-hexadecimal "^1.0.0" - stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -10972,10 +10812,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -10992,10 +10828,6 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -11042,15 +10874,15 @@ stylehacks@^2.3.2: text-table "^0.2.0" write-file-stdout "0.0.2" -stylelint-config-recommended@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-1.0.0.tgz#752c17fc68fa64cd5e7589e24f6e46e77e14a735" +stylelint-config-recommended@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-2.1.0.tgz#f526d5c771c6811186d9eaedbed02195fee30858" -stylelint-config-standard@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-17.0.0.tgz#42103a090054ee2a3dde9ecaed55e5d4d9d059fc" +stylelint-config-standard@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-18.2.0.tgz#6283149aba7f64f18731aef8f0abfb35cf619e06" dependencies: - stylelint-config-recommended "^1.0.0" + stylelint-config-recommended "^2.1.0" stylelint-order@0.4.x: version "0.4.4" @@ -11104,50 +10936,6 @@ stylelint@^7.5.0, stylelint@^7.9.0: svg-tags "^1.0.0" table "^4.0.1" -stylelint@^8.0.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-8.4.0.tgz#c2dbaeb17236917819f9206e1c0df5fddf6f83c3" - dependencies: - autoprefixer "^7.1.2" - balanced-match "^1.0.0" - chalk "^2.0.1" - cosmiconfig "^3.1.0" - debug "^3.0.0" - execall "^1.0.0" - file-entry-cache "^2.0.0" - get-stdin "^5.0.1" - globby "^7.0.0" - globjoin "^0.1.4" - html-tags "^2.0.0" - ignore "^3.3.3" - imurmurhash "^0.1.4" - known-css-properties "^0.5.0" - lodash "^4.17.4" - log-symbols "^2.0.0" - mathml-tag-names "^2.0.1" - meow "^4.0.0" - micromatch "^2.3.11" - normalize-selector "^0.2.0" - pify "^3.0.0" - postcss "^6.0.6" - postcss-html "^0.12.0" - postcss-less "^1.1.0" - postcss-media-query-parser "^0.2.3" - postcss-reporter "^5.0.0" - postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^3.0.1" - postcss-sass "^0.2.0" - postcss-scss "^1.0.2" - postcss-selector-parser "^3.1.0" - postcss-value-parser "^3.3.0" - resolve-from "^4.0.0" - specificity "^0.3.1" - string-width "^2.1.0" - style-search "^0.1.0" - sugarss "^1.0.0" - svg-tags "^1.0.0" - table "^4.0.1" - subarg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" @@ -11160,12 +10948,6 @@ sugarss@^0.2.0: dependencies: postcss "^5.2.4" -sugarss@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-1.0.1.tgz#be826d9003e0f247735f92365dc3fd7f1bae9e44" - dependencies: - postcss "^6.0.14" - supports-color@4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" @@ -11192,6 +10974,12 @@ supports-color@^4.0.0, supports-color@^4.4.0: dependencies: has-flag "^2.0.0" +supports-color@^5.2.0, supports-color@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" + dependencies: + has-flag "^3.0.0" + sver-compat@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" @@ -11542,10 +11330,6 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -11587,6 +11371,10 @@ tty-browserify@0.0.0, tty-browserify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -11735,7 +11523,7 @@ unherit@^1.0.4: inherits "^2.0.1" xtend "^4.0.1" -unified@^6.0.0, unified@^6.1.5: +unified@^6.1.5: version "6.1.6" resolved "https://registry.yarnpkg.com/unified/-/unified-6.1.6.tgz#5ea7f807a0898f1f8acdeefe5f25faa010cc42b1" dependencies: @@ -11767,22 +11555,10 @@ unique-stream@^2.0.2: json-stable-stringify "^1.0.0" through2-filter "^2.0.0" -unist-util-find-all-after@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-1.0.1.tgz#4e5512abfef7e0616781aecf7b1ed751c00af908" - dependencies: - unist-util-is "^2.0.0" - -unist-util-is@^2.0.0, unist-util-is@^2.1.1: +unist-util-is@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b" -unist-util-modify-children@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unist-util-modify-children/-/unist-util-modify-children-1.1.1.tgz#66d7e6a449e6f67220b976ab3cb8b5ebac39e51d" - dependencies: - array-iterate "^1.0.0" - unist-util-remove-position@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz#5a85c1555fc1ba0c101b86707d15e50fa4c871bb" -- cgit From 74e9a5c49103709f02d3b123ce7e957bcea172c7 Mon Sep 17 00:00:00 2001 From: frankiebee Date: Thu, 15 Mar 2018 10:41:25 -0700 Subject: add to CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7d4a09fe..75ba7670f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Current Master +- MetaMask will no longer allow nonces to be specified by the dapp - Add ability for internationalization. - Will now throw an error if the `to` field in txParams is not valid. - Will strip null values from the `to` field. -- cgit From 8b065443f2ae825ab912674579b1d5894b7e3bd5 Mon Sep 17 00:00:00 2001 From: matteopey Date: Thu, 15 Mar 2018 18:45:49 +0100 Subject: Add italian translation --- app/_locales/it/messages.json | 609 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 609 insertions(+) create mode 100644 app/_locales/it/messages.json diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json new file mode 100644 index 000000000..f6042ade7 --- /dev/null +++ b/app/_locales/it/messages.json @@ -0,0 +1,609 @@ +{ + "accept": { + "message": "Accetta" + }, + "account": { + "message": "Account" + }, + "accountDetails": { + "message": "Dettagli Account" + }, + "accountName": { + "message": "Nome Account" + }, + "address": { + "message": "Indirizzo" + }, + "addToken": { + "message": "Aggiungi Token" + }, + "amount": { + "message": "Importo" + }, + "amountPlusGas": { + "message": "Importo + Gas" + }, + "appDescription": { + "message": "Ethereum Browser Extension", + "description": "La descrizione dell'applicazione" + }, + "appName": { + "message": "MetaMask", + "description": "Il nome dell'applicazione" + }, + "attemptingConnect": { + "message": "Tentativo di connessione alla blockchain." + }, + "available": { + "message": "Disponibile" + }, + "back": { + "message": "Indietro" + }, + "balance": { + "message": "Bilancio:" + }, + "balanceIsInsufficientGas": { + "message": "Bilancio insufficiente per il gas totale corrente" + }, + "beta": { + "message": "BETA" + }, + "betweenMinAndMax": { + "message": "deve essere maggiore o uguale a $1 e minore o uguale a $2.", + "description": "aiuto per inserire un input esadecimale come decimale" + }, + "borrowDharma": { + "message": "Prendi in presisito con Dharma (Beta)" + }, + "buy": { + "message": "Compra" + }, + "buyCoinbase": { + "message": "Compra su Coinbase" + }, + "buyCoinbaseExplainer": { + "message": "Coinbase è il servizio più popolare al mondo per comprare e vendere bitcoin, ethereum e litecoin." + }, + "cancel": { + "message": "Cancella" + }, + "clickCopy": { + "message": "Clicca per Copiare" + }, + "confirm": { + "message": "Conferma" + }, + "confirmContract": { + "message": "Conferma Contratto" + }, + "confirmPassword": { + "message": "Conferma Password" + }, + "confirmTransaction": { + "message": "Conferma Transazione" + }, + "continueToCoinbase": { + "message": "Continua su Coinbase" + }, + "contractDeployment": { + "message": "Distribuzione Contratto" + }, + "conversionProgress": { + "message": "Conversione in corso" + }, + "copiedButton": { + "message": "Copiato" + }, + "copiedClipboard": { + "message": "Copiato negli Appunti" + }, + "copiedExclamation": { + "message": "Copiato!" + }, + "copy": { + "message": "Copia" + }, + "copyToClipboard": { + "message": "Copia negli appunti" + }, + "copyButton": { + "message": " Copia " + }, + "copyPrivateKey": { + "message": "Questa è la tua chiave privata (clicca per copiare)" + }, + "create": { + "message": "Crea" + }, + "createAccount": { + "message": "Crea Account" + }, + "createDen": { + "message": "Crea" + }, + "crypto": { + "message": "Crypto", + "description": "Tipo di exchange (cryptomonete)" + }, + "customGas": { + "message": "Personalizza Gas" + }, + "customize": { + "message": "Personalizza" + }, + "customRPC": { + "message": "RPC Personalizzata" + }, + "defaultNetwork": { + "message": "La rete predefinita per transazioni in Ether è la Rete Ethereum Principale." + }, + "denExplainer": { + "message": "Il DEN è il tuo archivio crittato con password dentro Metamask." + }, + "deposit": { + "message": "Deposita" + }, + "depositBTC": { + "message": "Deposita i tuoi BTC all'indirizzo sotto:" + }, + "depositCoin": { + "message": "Deposita $1 all'indirizzo sotto", + "description": "Dice all'utente quale moneta ha selezionato per depositare con Shapeshift" + }, + "depositEth": { + "message": "Deposita Eth" + }, + "depositEther": { + "message": "Deposita Ether" + }, + "depositFiat": { + "message": "Deposita con moneta Fiat" + }, + "depositFromAccount": { + "message": "Deposita da un altro account" + }, + "depositShapeShift": { + "message": "Deposita con ShapeShift" + }, + "depositShapeShiftExplainer": { + "message": "Se possiedi altre criptomonete, puoi scambiare e depositare Ether direttamente nel tuo portafoglio MetaMask. Nessun account richiesto." + }, + "details": { + "message": "Dettagli" + }, + "directDeposit": { + "message": "Deposito Diretto" + }, + "directDepositEther": { + "message": "Deposita Direttamente Ether" + }, + "directDepositEtherExplainer": { + "message": "Se possiedi già degli Ether, questa è la via più veloce per aggiungere Ether al tuo portafoglio con un deposito diretto." + }, + "done": { + "message": "Finito" + }, + "edit": { + "message": "Modifica" + }, + "editAccountName": { + "message": "Modifica Nome Account" + }, + "encryptNewDen": { + "message": "Cripta il tuo nuovo DEN" + }, + "enterPassword": { + "message": "Inserisci password" + }, + "etherscanView": { + "message": "Vedi account su Etherscan" + }, + "exchangeRate": { + "message": "Tasso di cambio" + }, + "exportPrivateKey": { + "message": "Esporta Chiave Privata" + }, + "exportPrivateKeyWarning": { + "message": "Esporta chiave privata a tuo rischio." + }, + "failed": { + "message": "Fallito" + }, + "fiat": { + "message": "FIAT", + "description": "Tipo di scambio" + }, + "fileImportFail": { + "message": "Importazione file non funziona? Clicca qui!", + "description": "Aiuta gli utenti a importare il loro account da un file JSON" + }, + "from": { + "message": "Da" + }, + "fromShapeShift": { + "message": "Da ShapeShift" + }, + "gas": { + "message": "Gas", + "description": "Piccola indicazione del costo del gas" + }, + "gasFee": { + "message": "Costo Gas" + }, + "gasLimit": { + "message": "Gas Limite" + }, + "gasLimitCalculation": { + "message": "Calcoliamo il gas limite suggerito in base al successo delle transazioni in rete." + }, + "gasLimitRequired": { + "message": "Gas Limite Richiesto" + }, + "gasLimitTooLow": { + "message": "Il Gas Limite deve essere almeno 21000" + }, + "gasPrice": { + "message": "Prezzo del Gas (GWEI)" + }, + "gasPriceCalculation": { + "message": "Calcoliamo il gas limite suggerito in base al successo delle transazioni in rete." + }, + "gasPriceRequired": { + "message": "Prezzo Gas Richiesto" + }, + "getEther": { + "message": "Ottieni Ether" + }, + "getEtherFromFaucet": { + "message": "Ottieni Get Ether da un faucet per $1", + "description": "Visualizza il nome della rete per il faucet Ether" + }, + "greaterThanMin": { + "message": "deve essere maggiore o uguale a $1.", + "description": "aiuto per inserire un input esadecimale come decimale" + }, + "here": { + "message": "qui", + "description": "per intendere -clicca qui- per maggiori informazioni (va con troubleTokenBalances)" + }, + "hide": { + "message": "Nascondi" + }, + "hideToken": { + "message": "Nascondi Token" + }, + "hideTokenPrompt": { + "message": "Nascondi Token?" + }, + "howToDeposit": { + "message": "Come vuoi depositare Ether?" + }, + "import": { + "message": "Importa", + "description": "Tasto per importare un account da un file selezionato" + }, + "importAccount": { + "message": "Importa Account" + }, + "importAnAccount": { + "message": "Importa un account" + }, + "importDen": { + "message": "Importa un DEN Esistente" + }, + "imported": { + "message": "Importato", + "description": "stato che conferma che un account è stato totalmente caricato nel portachiavi" + }, + "infoHelp": { + "message": "Informazioni & Aiuto" + }, + "invalidAddress": { + "message": "Indirizzo non valido" + }, + "invalidGasParams": { + "message": "Parametri del Gas non validi" + }, + "invalidInput": { + "message": "Input non valido." + }, + "invalidRequest": { + "message": "Richiesta non Valida" + }, + "jsonFile": { + "message": "File JSON", + "description": "formato per importare un account" + }, + "kovan": { + "message": "Rete di test Kovan" + }, + "lessThanMax": { + "message": "deve essere minore o uguale a $1.", + "description": "aiuto per inserire un input esadecimale come decimale" + }, + "limit": { + "message": "Limite" + }, + "loading": { + "message": "Caricamento..." + }, + "loadingTokens": { + "message": "Caricamento Tokens..." + }, + "localhost": { + "message": "Localhost 8545" + }, + "logout": { + "message": "Disconnetti" + }, + "loose": { + "message": "Libero" + }, + "mainnet": { + "message": "Rete Ethereum Principale" + }, + "message": { + "message": "Messaggio" + }, + "min": { + "message": "Minimo" + }, + "myAccounts": { + "message": "Account Miei" + }, + "needEtherInWallet": { + "message": "Per interagire con applicazioni decentralizzate con MetaMask, devi possedere Ether nel tuo portafoglio." + }, + "needImportFile": { + "message": "Devi selezionare un file da importare.", + "description": "L'utente sta importando un account e deve aggiungere un file per continuare" + }, + "needImportPassword": { + "message": "Dei inserire una password per il file selezionato.", + "description": "Password e file necessari per importare un account" + }, + "networks": { + "message": "Reti" + }, + "newAccount": { + "message": "Nuovo Account" + }, + "newAccountNumberName": { + "message": "Account $1", + "description": "Nome predefinito per il prossimo account da creare nella schermata di creazione account" + }, + "newContract": { + "message": "Nuovo Contratto" + }, + "newPassword": { + "message": "Nuova Password (minimo 8 caratteri)" + }, + "newRecipient": { + "message": "Nuovo Destinatario" + }, + "next": { + "message": "Prossimo" + }, + "noAddressForName": { + "message": "Nessun indirizzo è stato impostato per questo nome." + }, + "noDeposits": { + "message": "Nessun deposito ricevuto" + }, + "noTransactionHistory": { + "message": "Nessuna cronologia delle transazioni." + }, + "noTransactions": { + "message": "Nessuna Transazione" + }, + "notStarted": { + "message": "Non Iniziato" + }, + "oldUI": { + "message": "Vecchia interfaccia" + }, + "oldUIMessage": { + "message": "Sei ritornato alla vecchia interfaccia. Puoi ritornare alla nuova interfaccia tramite l'opzione nel menu a discesa in alto a destra." + }, + "or": { + "message": "o", + "description": "scelta tra creare o importare un nuovo account" + }, + "passwordMismatch": { + "message": "le password non corrispondono", + "description": "nella creazione della password, le due password all'interno dei campi non corrispondono" + }, + "passwordShort": { + "message": "password non sufficientemente lunga", + "description": "nella creazione della password, la password non è lunga abbastanza" + }, + "pastePrivateKey": { + "message": "Incolla la tua chiave privata qui:", + "description": "Per importare un account da una chiave privata" + }, + "pasteSeed": { + "message": "Incolla la tua frase seed qui!" + }, + "pleaseReviewTransaction": { + "message": "Ricontrolla la tua transazione." + }, + "privateKey": { + "message": "Chiave Privata", + "description": "seleziona questo tipo di file per importare un account" + }, + "privateKeyWarning": { + "message": "Attenzione: non dire a nessuno questa chiave! Chiunque con la tua chiave privata può rubare qualsiasi moneta contenuta nel tuo account." + }, + "privateNetwork": { + "message": "Rete Privata" + }, + "qrCode": { + "message": "Mostra Codice QR" + }, + "readdToken": { + "message": "Puoi aggiungere nuovamente questo token in futuro andando in “Aggiungi token” nel menu delle opzioni del tuo account." + }, + "readMore": { + "message": "Leggi di più qui." + }, + "receive": { + "message": "Ricevi" + }, + "recipientAddress": { + "message": "Indirizzo Destinatario" + }, + "refundAddress": { + "message": "Indirizzo di Rimborso" + }, + "rejected": { + "message": "Respinta" + }, + "required": { + "message": "Richiesto" + }, + "retryWithMoreGas": { + "message": "Riprova con un prezzo del Gas maggiore qui" + }, + "revert": { + "message": "Annulla" + }, + "rinkeby": { + "message": "Rete di test Rinkeby" + }, + "ropsten": { + "message": "Rete di test Ropsten" + }, + "sampleAccountName": { + "message": "Es: Il mio nuovo account", + "description": "Aiuta l'utente a capire il concetto di aggiungere un nome leggibile al loro account" + }, + "save": { + "message": "Salva" + }, + "saveAsFile": { + "message": "Salva come File", + "description": "Processo per esportare un account" + }, + "selectService": { + "message": "Seleziona Servizio" + }, + "send": { + "message": "Invia" + }, + "sendTokens": { + "message": "Invia Tokens" + }, + "sendTokensAnywhere": { + "message": "Invia Tokens a chiunque abbia un account Ethereum" + }, + "settings": { + "message": "Impostazioni" + }, + "shapeshiftBuy": { + "message": "Compra con Shapeshift" + }, + "showPrivateKeys": { + "message": "Mostra Chiave Privata" + }, + "showQRCode": { + "message": "Mostra Codie QR" + }, + "sign": { + "message": "Firma" + }, + "signMessage": { + "message": "Firma Messaggio" + }, + "signNotice": { + "message": "Firmare questo messaggio può avere effetti collaterali pericolosi. \nFirma messaggi da siti di cui ti fidi totalmente. \nQuesto metodo pericoloso sarà rimosso in versioni future." + }, + "sigRequest": { + "message": "Firma Richiesta" + }, + "sigRequested": { + "message": "Richiesta Firma" + }, + "status": { + "message": "Stato" + }, + "submit": { + "message": "Invia" + }, + "takesTooLong": { + "message": "Ci sta mettendo troppo?" + }, + "testFaucet": { + "message": "Prova Faucet" + }, + "to": { + "message": "A" + }, + "toETHviaShapeShift": { + "message": "$1 a ETH via ShapeShift", + "description": "il sistema riempirà il tipo di deposito all'inizio del messaggio" + }, + "tokenBalance": { + "message": "Bilancio Token:" + }, + "total": { + "message": "Totale" + }, + "transactionMemo": { + "message": "Promemoria Transazione (opzionale)" + }, + "transactionNumber": { + "message": "Numero Transazione" + }, + "transfers": { + "message": "Trasferimenti" + }, + "troubleTokenBalances": { + "message": "Abbiamo avuto un problema a caricare il bilancio dei tuoi token. Puoi vederlo ", + "description": "Seguito da un link (qui) per vedere il bilancio dei token" + }, + "typePassword": { + "message": "Inserisci Password" + }, + "uiWelcome": { + "message": "Benvenuto alla nuova interfaccia (Beta)" + }, + "uiWelcomeMessage": { + "message": "Stai utilizzanto la nuova interfaccia di MetaMask. Guarda in giro, prova nuove funzionalità come inviare token, e facci sapere se hai dei problemi." + }, + "unavailable": { + "message": "Non Disponibile" + }, + "unknown": { + "message": "Sconosciuto" + }, + "unknownNetwork": { + "message": "Rete Privata Sconosciuta" + }, + "unknownNetworkId": { + "message": "ID rete sconosciuto" + }, + "usaOnly": { + "message": "Solo USA", + "description": "Usare questo sito di scambio è possibile solo per persone residenti in USA." + }, + "usedByClients": { + "message": "Usato da una varietà di clienti diversi" + }, + "viewAccount": { + "message": "Vedi Account" + }, + "warning": { + "message": "Attenzione" + }, + "whatsThis": { + "message": "Cos'è questo?" + }, + "yourSigRequested": { + "message": "La tua firma sta venendo richiesta" + }, + "youSign": { + "message": "Ti stai connettendo" + } +} -- cgit From d8f5150aa5bf4b04310f887504428f1caa13cbf4 Mon Sep 17 00:00:00 2001 From: Lazaridis Date: Fri, 16 Mar 2018 00:27:10 +0200 Subject: adds initial documentation, re #3568 --- app/scripts/metamask-controller.js | 178 ++++++++++++++++++++++++++++--------- 1 file changed, 138 insertions(+), 40 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 0a5c1d36f..31c0bed58 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1,3 +1,9 @@ +/** + * @file The central metamask controller. Aggregates other controllers and exports an api. + * @copyright Copyright (c) 2018 MetaMask + * @license MIT + */ + const EventEmitter = require('events') const extend = require('xtend') const pump = require('pump') @@ -41,7 +47,11 @@ const seedPhraseVerifier = require('./lib/seed-phrase-verifier') module.exports = class MetamaskController extends EventEmitter { - constructor (opts) { + /** + * @constructor + * @param {Object} opts + */ + constructor (opts) { super() this.defaultMaxListeners = 20 @@ -223,10 +233,9 @@ module.exports = class MetamaskController extends EventEmitter { this.infuraController.store.subscribe(sendUpdate) } - // - // Constructor helpers - // - + /** + * Constructor helper: initialize a provider. + */ initializeProvider () { const providerOpts = { static: { @@ -257,6 +266,9 @@ module.exports = class MetamaskController extends EventEmitter { return providerProxy } + /** + * Constructor helper: initialize a public confi store. + */ initPublicConfigStore () { // get init state const publicConfigStore = new ObservableStore() @@ -282,6 +294,9 @@ module.exports = class MetamaskController extends EventEmitter { // State Management // + /** + * ? + */ getState () { const wallet = this.configManager.getWallet() const vault = this.keyringController.store.getState().vault @@ -319,7 +334,10 @@ module.exports = class MetamaskController extends EventEmitter { // // Remote Features // - + + /** + * ? + */ getApi () { const keyringController = this.keyringController const preferencesController = this.preferencesController @@ -517,10 +535,22 @@ module.exports = class MetamaskController extends EventEmitter { return '0x' + percentileNumBn.mul(GWEI_BN).toString(16) } - // - // Vault Management - // - +//============================================================================= +// VAULT / KEYRING RELATED METHODS +//============================================================================= + + /** + * Creates a new Vault(?) and create a new keychain(?) + * + * A vault is ... + * + * A keychain is ... + * + * + * @param {} password + * + * @returns {} vault + */ async createNewVaultAndKeychain (password) { const release = await this.createVaultMutex.acquire() let vault @@ -544,6 +574,11 @@ module.exports = class MetamaskController extends EventEmitter { return vault } + /** + * Create a new Vault and restore an existent keychain + * @param {} password + * @param {} seed + */ async createNewVaultAndRestore (password, seed) { const release = await this.createVaultMutex.acquire() try { @@ -557,16 +592,28 @@ module.exports = class MetamaskController extends EventEmitter { } } + /** + * Retrieves the first Identiy from the passed Vault and selects the related address + * + * An Identity is ... + * + * @param {} vault + */ selectFirstIdentity (vault) { const { identities } = vault const address = Object.keys(identities)[0] this.preferencesController.setSelectedAddress(address) } - // + // ? // Opinionated Keyring Management // + /** + * Adds a new account to ... + * + * @returns {} keyState + */ async addNewAccount () { const primaryKeyring = this.keyringController.getKeyringsByType('HD Key Tree')[0] if (!primaryKeyring) { @@ -588,10 +635,12 @@ module.exports = class MetamaskController extends EventEmitter { return keyState } - // Adds the current vault's seed words to the UI's state tree. - // - // Used when creating a first vault, to allow confirmation. - // Also used when revealing the seed words in the confirmation view. + /** + * Adds the current vault's seed words to the UI's state tree. + * + * Used when creating a first vault, to allow confirmation. + * Also used when revealing the seed words in the confirmation view. + */ placeSeedWords (cb) { this.verifySeedPhrase() @@ -604,10 +653,13 @@ module.exports = class MetamaskController extends EventEmitter { }) } - // Verifies the current vault's seed words if they can restore the - // accounts belonging to the current vault. - // - // Called when the first account is created and on unlocking the vault. + /** + * Verifies the validity of the current vault's seed phrase. + * + * Validity: seed phrase can restore the accounts belonging to the current vault. + * + * Called when the first account is created and on unlocking the vault. + */ async verifySeedPhrase () { const primaryKeyring = this.keyringController.getKeyringsByType('HD Key Tree')[0] @@ -632,22 +684,33 @@ module.exports = class MetamaskController extends EventEmitter { } } - // ClearSeedWordCache - // - // Removes the primary account's seed words from the UI's state tree, - // ensuring they are only ever available in the background process. + /** + * Remove the primary account seed phrase from the UI's state tree. + * + * The seed phrase remains available in the background process. + * + */ clearSeedWordCache (cb) { this.configManager.setSeedWords(null) cb(null, this.preferencesController.getSelectedAddress()) } - + + /** + * ? + */ resetAccount (cb) { const selectedAddress = this.preferencesController.getSelectedAddress() this.txController.wipeTransactions(selectedAddress) cb(null, selectedAddress) } - + /** + * Imports an account ... ? + * + * @param {} strategy + * @param {} args + * @param {} cb + */ importAccountWithStrategy (strategy, args, cb) { accountImporter.importAccount(strategy, args) .then((privateKey) => { @@ -659,11 +722,15 @@ module.exports = class MetamaskController extends EventEmitter { .catch((reason) => { cb(reason) }) } +//============================================================================= +// END (VAULT / KEYRING RELATED METHODS) +//============================================================================= - // - // Identity Management - // - // + + +//============================================================================= +// Identity Management +//============================================================================= async retryTransaction (txId, cb) { await this.txController.retryTransaction(txId) @@ -729,7 +796,11 @@ module.exports = class MetamaskController extends EventEmitter { } }) } - + + /** + * @param {} msgParams + * @param {} cb + */ signMessage (msgParams, cb) { log.info('MetaMaskController - signMessage') const msgId = msgParams.metamaskId @@ -758,6 +829,12 @@ module.exports = class MetamaskController extends EventEmitter { } // Prefixed Style Message Signing Methods: + + /** + * + * @param {} msgParams + * @param {} cb + */ approvePersonalMessage (msgParams, cb) { const msgId = this.personalMessageManager.addUnapprovedMessage(msgParams) this.sendUpdate() @@ -773,7 +850,10 @@ module.exports = class MetamaskController extends EventEmitter { } }) } - + + /** + * @param {} msgParams + */ signPersonalMessage (msgParams) { log.info('MetaMaskController - signPersonalMessage') const msgId = msgParams.metamaskId @@ -791,7 +871,10 @@ module.exports = class MetamaskController extends EventEmitter { return this.getState() }) } - + + /** + * @param {} msgParams + */ signTypedMessage (msgParams) { log.info('MetaMaskController - signTypedMessage') const msgId = msgParams.metamaskId @@ -843,13 +926,23 @@ module.exports = class MetamaskController extends EventEmitter { this.sendUpdate() cb() } - + + /** + * ? + * + * @param {} migratorOutput + */ restoreOldVaultAccounts (migratorOutput) { const { serialized } = migratorOutput return this.keyringController.restoreKeyring(serialized) .then(() => migratorOutput) } + /** + * ? + * + * @param {} migratorOutput + */ restoreOldLostAccounts (migratorOutput) { const { lostAccounts } = migratorOutput if (lostAccounts) { @@ -859,10 +952,15 @@ module.exports = class MetamaskController extends EventEmitter { return Promise.resolve(migratorOutput) } - // IMPORT LOST ACCOUNTS - // @Object with key lostAccounts: @Array accounts <{ address, privateKey }> - // Uses the array's private keys to create a new Simple Key Pair keychain - // and add it to the keyring controller. + + /** + * Import (lost) Accounts + * + * @param {Object} {lostAccounts} @Array accounts <{ address, privateKey }> + * + * Uses the array's private keys to create a new Simple Key Pair keychain + * and add it to the keyring controller. + */ importLostAccounts ({ lostAccounts }) { const privKeys = lostAccounts.map(acct => acct.privateKey) return this.keyringController.restoreKeyring({ @@ -871,9 +969,9 @@ module.exports = class MetamaskController extends EventEmitter { }) } - // - // config - // +//============================================================================= +// CONFIG +//============================================================================= // Log blocks -- cgit From 9523dd626652c84f660d5bd8ae73aa38c2a837ef Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 15 Mar 2018 16:05:49 -0700 Subject: More for i18n --- app/_locales/en/messages.json | 210 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 1ca31427d..9c13ebf52 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -14,9 +14,15 @@ "address": { "message": "Address" }, + "addCustomToken": { + "message": "Add custom token" + }, "addToken": { "message": "Add Token" }, + "addTokens": { + "message": "Add Tokens" + }, "amount": { "message": "Amount" }, @@ -34,6 +40,9 @@ "attemptingConnect": { "message": "Attempting to connect to blockchain." }, + "attributions": { + "message": "Attributions" + }, "available": { "message": "Available" }, @@ -43,6 +52,9 @@ "balance": { "message": "Balance:" }, + "balances": { + "message": "Your balances" + }, "balanceIsInsufficientGas": { "message": "Insufficient balance for current gas total" }, @@ -53,9 +65,15 @@ "message": "must be greater than or equal to $1 and less than or equal to $2.", "description": "helper for inputting hex as decimal input" }, + "blockiesIdenticon": { + "messages": "Use Blockies Identicon" + }, "borrowDharma": { "message": "Borrow With Dharma (Beta)" }, + "builtInCalifornia": { + "message": "MetaMask is designed and built in California." + }, "buy": { "message": "Buy" }, @@ -68,6 +86,9 @@ "cancel": { "message": "Cancel" }, + "classicInterface": { + "message": "Use classic interface" + }, "clickCopy": { "message": "Click to Copy" }, @@ -83,6 +104,9 @@ "confirmTransaction": { "message": "Confirm Transaction" }, + "continue": { + "message": "Continue" + }, "continueToCoinbase": { "message": "Continue to Coinbase" }, @@ -101,6 +125,9 @@ "copiedExclamation": { "message": "Copied!" }, + "copiedSafe": { + "message": "I've copied it somewhere safe" + }, "copy": { "message": "Copy" }, @@ -126,6 +153,12 @@ "message": "Crypto", "description": "Exchange type (cryptocurrencies)" }, + "currentConversion": { + "message": "Current Conversion" + }, + "currentNetwork": { + "message": "Current Network" + }, "customGas": { "message": "Customize Gas" }, @@ -135,6 +168,12 @@ "customRPC": { "message": "Custom RPC" }, + "decimalsMustZerotoTen": { + "message": "Decimals must be at least 0, and not over 36." + }, + "decimal": { + "message": "Decimals of Precision" + }, "defaultNetwork": { "message": "The default network for Ether transactions is Main Net." }, @@ -184,18 +223,27 @@ "done": { "message": "Done" }, + "downloadStatelogs": { + "message": "Download State Logs" + }, "edit": { "message": "Edit" }, "editAccountName": { "message": "Edit Account Name" }, + "emailUs": { + "message": "Email us!" + }, "encryptNewDen": { "message": "Encrypt your new DEN" }, "enterPassword": { "message": "Enter password" }, + "enterPasswordConfirm": { + "message": "Enter your password to confirm" + }, "etherscanView": { "message": "View account on Etherscan" }, @@ -219,9 +267,15 @@ "message": "File import not working? Click here!", "description": "Helps user import their account from a JSON file" }, + "followTwitter": { + "message": "Follow us on Twitter" + }, "from": { "message": "From" }, + "fromToSame": { + "message": "From and To address cannot be the same" + }, "fromShapeShift": { "message": "From ShapeShift" }, @@ -244,6 +298,9 @@ "gasLimitTooLow": { "message": "Gas limit must be at least 21000" }, + "generatingSeed": { + "message": "Generating Seed..." + }, "gasPrice": { "message": "Gas Price (GWEI)" }, @@ -268,6 +325,9 @@ "message": "here", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, + "hereList": { + "message": "Here's a list!!!!" + }, "hide": { "message": "Hide" }, @@ -280,6 +340,9 @@ "howToDeposit": { "message": "How would you like to deposit Ether?" }, + "holdEther": { + "message": "It allows you to hold ether & tokens, and serves as your bridge to decentralized applications." + }, "import": { "message": "Import", "description": "Button to import an account from a selected file" @@ -287,6 +350,9 @@ "importAccount": { "message": "Import Account" }, + "importAccountMsg": { + "message":" Imported accounts will not be associated with your originally created MetaMask account seedphrase. Learn more about imported accounts " + }, "importAnAccount": { "message": "Import an account" }, @@ -300,9 +366,18 @@ "infoHelp": { "message": "Info & Help" }, + "insufficientFunds": { + "message": "Insufficient funds." + }, + "insufficientTokens": { + "message": "Insufficient tokens." + }, "invalidAddress": { "message": "Invalid address" }, + "invalidAddressRecipient": { + "message": "Recipient address is invalid" + }, "invalidGasParams": { "message": "Invalid Gas Parameters" }, @@ -312,6 +387,12 @@ "invalidRequest": { "message": "Invalid Request" }, + "invalidRPC": { + "message": "Invalid RPC URI" + }, + "jsonFail": { + "message": "Something went wrong. Please make sure your JSON file is properly formatted." + }, "jsonFile": { "message": "JSON File", "description": "format for importing an account" @@ -319,10 +400,16 @@ "kovan": { "message": "Kovan Test Network" }, + "knowledgeDataBase": { + "message": "Visit our Knowledge Base" + }, "lessThanMax": { "message": "must be less than or equal to $1.", "description": "helper for inputting hex as decimal input" }, + "likeToAddTokens": { + "message": "Would you like to add these tokens?" + }, "limit": { "message": "Limit" }, @@ -335,24 +422,36 @@ "localhost": { "message": "Localhost 8545" }, + "login": { + "message": "Log In" + }, "logout": { "message": "Log out" }, "loose": { "message": "Loose" }, + "loweCaseWords": { + "message": "seed words only have lowercase characters" + }, "mainnet": { "message": "Main Ethereum Network" }, "message": { "message": "Message" }, + "metamaskDescription": { + "message": "MetaMask is a secure identity vault for Ethereum." + }, "min": { "message": "Minimum" }, "myAccounts": { "message": "My Accounts" }, + "mustSelectOne": { + "message": "Must select at least 1 token." + }, "needEtherInWallet": { "message": "To interact with decentralized applications using MetaMask, you’ll need Ether in your wallet." }, @@ -364,6 +463,9 @@ "message": "You must enter a password for the selected file.", "description": "Password and file needed to import an account" }, + "negativeETH": { + "message": "Can not send negative amounts of ETH." + }, "networks": { "message": "Networks" }, @@ -383,6 +485,9 @@ "newRecipient": { "message": "New Recipient" }, + "newRPC": { + "message": "New RPC URL" + }, "next": { "message": "Next" }, @@ -411,6 +516,9 @@ "message": "or", "description": "choice between creating or importing a new account" }, + "passwordCorrect": { + "message": "Please make sure your password is correct." + }, "passwordMismatch": { "message": "passwords don't match", "description": "in password creation process, the two new password fields did not match" @@ -426,9 +534,15 @@ "pasteSeed": { "message": "Paste your seed phrase here!" }, + "personalAddressDetected": { + "message": "Personal address detected. Input the token contract address." + }, "pleaseReviewTransaction": { "message": "Please review your transaction." }, + "privacyMsg": { + "message": "Privacy Policy" + }, "privateKey": { "message": "Private Key", "description": "select this type of file to use to import an account" @@ -448,6 +562,9 @@ "readMore": { "message": "Read more here." }, + "readMore2": { + "message": "Read more." + }, "receive": { "message": "Receive" }, @@ -460,12 +577,24 @@ "rejected": { "message": "Rejected" }, + "resetAccount": { + "message": "Reset Account" + }, + "restoreFromSeed": { + "message": "Restore from seed phrase" + }, "required": { "message": "Required" }, "retryWithMoreGas": { "message": "Retry with a higher gas price here" }, + "revealSeedWords": { + "message": "Reveal Seed Words" + }, + "revealSeedWordsWarning": { + "message": "Do not recover your seed words in a public place! These words can be used to steal all your accounts." + }, "revert": { "message": "Revert" }, @@ -486,12 +615,36 @@ "message": "Save as File", "description": "Account export process" }, + "saveSeedAsFile": { + "message": "Save Seed Words As File" + }, + "search": { + "message": "Search" + }, + "secretPhrase": { + "message": "Enter your secret twelve word phrase here to restore your vault." + }, + "seedPhraseReq": { + "message": "seed phrases are 12 words long" + }, + "select": { + "message": "Select" + }, + "selectCurrency": { + "message": "Select Currency" + }, "selectService": { "message": "Select Service" }, + "selectType": { + "message": "Select Type" + }, "send": { "message": "Send" }, + "sendETH": { + "message": "Send ETH" + }, "sendTokens": { "message": "Send Tokens" }, @@ -525,15 +678,33 @@ "sigRequested": { "message": "Signature Requested" }, + "spaceBetween": { + "message": "there can only be a space between words" + }, "status": { "message": "Status" }, + "stateLogs": { + "message": "State Logs" + }, + "stateLogsDescription": { + "message": "State logs contain your public account addresses and sent transactions." + }, "submit": { "message": "Submit" }, + "supportCenter": { + "message": "Visit our Support Center" + }, + "symbolBetweenZeroTen": { + "message": "Symbol must be between 0 and 10 characters." + }, "takesTooLong": { "message": "Taking too long?" }, + "terms": { + "message": "Terms of Use" + }, "testFaucet": { "message": "Test Faucet" }, @@ -544,12 +715,30 @@ "message": "$1 to ETH via ShapeShift", "description": "system will fill in deposit type in start of message" }, + "tokenAddress": { + "message": "Token Address" + }, + "tokenAlreadyAdded": { + "message": "Token has already been added." + }, "tokenBalance": { "message": "Your Token Balance is:" }, + "tokenSelection": { + "message": "Search for tokens or select from our list of popular tokens." + }, + "tokenSymbol": { + "message": "Token Symbol" + }, + "tokenWarning1": { + "message": "Keep track of the tokens you’ve bought with your MetaMask account. If you bought tokens using a different account, those tokens will not appear here." + }, "total": { "message": "Total" }, + "transactions": { + "message": "transactions" + }, "transactionMemo": { "message": "Transaction memo (optional)" }, @@ -563,6 +752,9 @@ "message": "We had trouble loading your token balances. You can view them ", "description": "Followed by a link (here) to view token balances" }, + "twelveWords": { + "message": "These 12 words are the only way to restore your MetaMask accounts.\nSave them somewhere safe and secret." + }, "typePassword": { "message": "Type Your Password" }, @@ -584,6 +776,9 @@ "unknownNetworkId": { "message": "Unknown network ID" }, + "uriErrorMsg": { + "message": "URIs require the appropriate HTTP/HTTPS prefix." + }, "usaOnly": { "message": "USA only", "description": "Using this exchange is limited to people inside the USA" @@ -591,12 +786,27 @@ "usedByClients": { "message": "Used by a variety of different clients" }, + "useOldUI": { + "message": "Use old UI" + }, + "validFileImport": { + "message": "You must select a valid file to import." + }, + "vaultCreated": { + "message": "Vault Created" + }, "viewAccount": { "message": "View Account" }, + "visitWebSite": { + "message": "Visit our web site" + }, "warning": { "message": "Warning" }, + "welcomeBeta": { + "message": "Welcome to MetaMask Beta" + }, "whatsThis": { "message": "What's this?" }, -- cgit From 904f00e8acf40a72d233d1776c8aa760026e1bd3 Mon Sep 17 00:00:00 2001 From: Lazaridis Date: Fri, 16 Mar 2018 02:29:53 +0200 Subject: group all vault/keyring related methods together, re #3568 --- app/scripts/metamask-controller.js | 258 +++++++++++++++++++------------------ 1 file changed, 130 insertions(+), 128 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 31c0bed58..cbdf757c6 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -267,7 +267,7 @@ module.exports = class MetamaskController extends EventEmitter { } /** - * Constructor helper: initialize a public confi store. + * Constructor helper: initialize a public config store. */ initPublicConfigStore () { // get init state @@ -290,12 +290,11 @@ module.exports = class MetamaskController extends EventEmitter { return publicConfigStore } - // - // State Management - // /** - * ? + * The metamask-state of the various controllers, made available to the UI + * + * @returns {Object} status */ getState () { const wallet = this.configManager.getWallet() @@ -331,12 +330,10 @@ module.exports = class MetamaskController extends EventEmitter { ) } - // - // Remote Features - // - /** - * ? + * Returns an api-object which is consumed by the UI + * + * @returns {Object} */ getApi () { const keyringController = this.keyringController @@ -656,7 +653,7 @@ module.exports = class MetamaskController extends EventEmitter { /** * Verifies the validity of the current vault's seed phrase. * - * Validity: seed phrase can restore the accounts belonging to the current vault. + * Validity: seed phrase restores the accounts belonging to the current vault. * * Called when the first account is created and on unlocking the vault. */ @@ -722,81 +719,9 @@ module.exports = class MetamaskController extends EventEmitter { .catch((reason) => { cb(reason) }) } -//============================================================================= -// END (VAULT / KEYRING RELATED METHODS) -//============================================================================= - - - -//============================================================================= -// Identity Management -//============================================================================= - - async retryTransaction (txId, cb) { - await this.txController.retryTransaction(txId) - const state = await this.getState() - return state - } - - - newUnsignedMessage (msgParams, cb) { - const msgId = this.messageManager.addUnapprovedMessage(msgParams) - this.sendUpdate() - this.opts.showUnconfirmedMessage() - this.messageManager.once(`${msgId}:finished`, (data) => { - switch (data.status) { - case 'signed': - return cb(null, data.rawSig) - case 'rejected': - return cb(new Error('MetaMask Message Signature: User denied message signature.')) - default: - return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) - } - }) - } - - newUnsignedPersonalMessage (msgParams, cb) { - if (!msgParams.from) { - return cb(new Error('MetaMask Message Signature: from field is required.')) - } - - const msgId = this.personalMessageManager.addUnapprovedMessage(msgParams) - this.sendUpdate() - this.opts.showUnconfirmedMessage() - this.personalMessageManager.once(`${msgId}:finished`, (data) => { - switch (data.status) { - case 'signed': - return cb(null, data.rawSig) - case 'rejected': - return cb(new Error('MetaMask Message Signature: User denied message signature.')) - default: - return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) - } - }) - } - - newUnsignedTypedMessage (msgParams, cb) { - let msgId - try { - msgId = this.typedMessageManager.addUnapprovedMessage(msgParams) - this.sendUpdate() - this.opts.showUnconfirmedMessage() - } catch (e) { - return cb(e) - } + // --------------------------------------------------------------------------- + // Identity Management (sign) - this.typedMessageManager.once(`${msgId}:finished`, (data) => { - switch (data.status) { - case 'signed': - return cb(null, data.rawSig) - case 'rejected': - return cb(new Error('MetaMask Message Signature: User denied message signature.')) - default: - return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) - } - }) - } - /** * @param {} msgParams * @param {} cb @@ -820,14 +745,6 @@ module.exports = class MetamaskController extends EventEmitter { }) } - cancelMessage (msgId, cb) { - const messageManager = this.messageManager - messageManager.rejectMsg(msgId) - if (cb && typeof cb === 'function') { - cb(null, this.getState()) - } - } - // Prefixed Style Message Signing Methods: /** @@ -892,41 +809,10 @@ module.exports = class MetamaskController extends EventEmitter { return this.getState() }) } - - cancelPersonalMessage (msgId, cb) { - const messageManager = this.personalMessageManager - messageManager.rejectMsg(msgId) - if (cb && typeof cb === 'function') { - cb(null, this.getState()) - } - } - - cancelTypedMessage (msgId, cb) { - const messageManager = this.typedMessageManager - messageManager.rejectMsg(msgId) - if (cb && typeof cb === 'function') { - cb(null, this.getState()) - } - } - - markAccountsFound (cb) { - this.configManager.setLostAccounts([]) - this.sendUpdate() - cb(null, this.getState()) - } - - markPasswordForgotten(cb) { - this.configManager.setPasswordForgotten(true) - this.sendUpdate() - cb() - } - - unMarkPasswordForgotten(cb) { - this.configManager.setPasswordForgotten(false) - this.sendUpdate() - cb() - } + // --------------------------------------------------------------------------- + // Account Restauration + /** * ? * @@ -952,7 +838,6 @@ module.exports = class MetamaskController extends EventEmitter { return Promise.resolve(migratorOutput) } - /** * Import (lost) Accounts * @@ -969,6 +854,123 @@ module.exports = class MetamaskController extends EventEmitter { }) } +//============================================================================= +// END (VAULT / KEYRING RELATED METHODS) +//============================================================================= + + + +//============================================================================= +// MESSAGES +//============================================================================= + + async retryTransaction (txId, cb) { + await this.txController.retryTransaction(txId) + const state = await this.getState() + return state + } + + + newUnsignedMessage (msgParams, cb) { + const msgId = this.messageManager.addUnapprovedMessage(msgParams) + this.sendUpdate() + this.opts.showUnconfirmedMessage() + this.messageManager.once(`${msgId}:finished`, (data) => { + switch (data.status) { + case 'signed': + return cb(null, data.rawSig) + case 'rejected': + return cb(new Error('MetaMask Message Signature: User denied message signature.')) + default: + return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) + } + }) + } + + newUnsignedPersonalMessage (msgParams, cb) { + if (!msgParams.from) { + return cb(new Error('MetaMask Message Signature: from field is required.')) + } + + const msgId = this.personalMessageManager.addUnapprovedMessage(msgParams) + this.sendUpdate() + this.opts.showUnconfirmedMessage() + this.personalMessageManager.once(`${msgId}:finished`, (data) => { + switch (data.status) { + case 'signed': + return cb(null, data.rawSig) + case 'rejected': + return cb(new Error('MetaMask Message Signature: User denied message signature.')) + default: + return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) + } + }) + } + + newUnsignedTypedMessage (msgParams, cb) { + let msgId + try { + msgId = this.typedMessageManager.addUnapprovedMessage(msgParams) + this.sendUpdate() + this.opts.showUnconfirmedMessage() + } catch (e) { + return cb(e) + } + + this.typedMessageManager.once(`${msgId}:finished`, (data) => { + switch (data.status) { + case 'signed': + return cb(null, data.rawSig) + case 'rejected': + return cb(new Error('MetaMask Message Signature: User denied message signature.')) + default: + return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) + } + }) + } + + cancelMessage (msgId, cb) { + const messageManager = this.messageManager + messageManager.rejectMsg(msgId) + if (cb && typeof cb === 'function') { + cb(null, this.getState()) + } + } + + cancelPersonalMessage (msgId, cb) { + const messageManager = this.personalMessageManager + messageManager.rejectMsg(msgId) + if (cb && typeof cb === 'function') { + cb(null, this.getState()) + } + } + + cancelTypedMessage (msgId, cb) { + const messageManager = this.typedMessageManager + messageManager.rejectMsg(msgId) + if (cb && typeof cb === 'function') { + cb(null, this.getState()) + } + } + + markAccountsFound (cb) { + this.configManager.setLostAccounts([]) + this.sendUpdate() + cb(null, this.getState()) + } + + markPasswordForgotten(cb) { + this.configManager.setPasswordForgotten(true) + this.sendUpdate() + cb() + } + + unMarkPasswordForgotten(cb) { + this.configManager.setPasswordForgotten(false) + this.sendUpdate() + cb() + } + //============================================================================= // CONFIG //============================================================================= -- cgit From bb6af25e20f723942a2b5770a8763bff3b6d6032 Mon Sep 17 00:00:00 2001 From: Lazaridis Date: Fri, 16 Mar 2018 03:22:10 +0200 Subject: add ESLint exceptions for //= and //-, re #3568 --- .eslintrc | 2 +- app/scripts/metamask-controller.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.eslintrc b/.eslintrc index 20a2a7a00..4fa7c2d7f 100644 --- a/.eslintrc +++ b/.eslintrc @@ -148,7 +148,7 @@ "space-in-parens": [1, "never"], "space-infix-ops": 2, "space-unary-ops": [2, { "words": true, "nonwords": false }], - "spaced-comment": [2, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","] }], + "spaced-comment": [2, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","], "exceptions": ["=", "-"] } ], "strict": 0, "template-curly-spacing": [2, "never"], "use-isnan": 2, diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index cbdf757c6..953e22fc7 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -858,11 +858,11 @@ module.exports = class MetamaskController extends EventEmitter { // END (VAULT / KEYRING RELATED METHODS) //============================================================================= +// - -//============================================================================= +//============================================================================= // MESSAGES -//============================================================================= +//============================================================================= async retryTransaction (txId, cb) { await this.txController.retryTransaction(txId) -- cgit From 55d0ffd4a0363c3e3f9c428d4e7830d2965fd628 Mon Sep 17 00:00:00 2001 From: nujabes403 Date: Fri, 16 Mar 2018 14:22:09 +0900 Subject: Update messages.json --- app/_locales/ko/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index a0290c119..f03be982f 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1,6 +1,6 @@ { "accept": { - "message": "허용" + "message": "수락" }, "account": { "message": "계좌" -- cgit From 4be9d146dbb0b8f99f9c1afe4e11c25fd7dbf04a Mon Sep 17 00:00:00 2001 From: nujabes403 Date: Fri, 16 Mar 2018 14:22:36 +0900 Subject: Update messages.json --- app/_locales/ko/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index f03be982f..890e45d37 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -18,10 +18,10 @@ "message": "토큰 추가" }, "amount": { - "message": "양" + "message": "금액" }, "amountPlusGas": { - "message": "양 + 가스" + "message": "금액 + 가스" }, "appDescription": { "message": "이더리움 브라우저 확장 프로그램", -- cgit From 6fa8de6e937cc8d43448b5e062c527a6257d71a0 Mon Sep 17 00:00:00 2001 From: nujabes403 Date: Fri, 16 Mar 2018 14:24:41 +0900 Subject: Update messages.json --- app/_locales/ko/messages.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 890e45d37..75f230cff 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -35,7 +35,7 @@ "message": "블록체인에 접속 시도 중입니다." }, "available": { - "message": "유효" + "message": "사용 가능한" }, "back": { "message": "뒤로" @@ -50,7 +50,7 @@ "message": "베타" }, "betweenMinAndMax": { - "message": "1 달러 이상 2 달러 이하여야 합니다.", + "message": "$1 이상 $2 이하여야 합니다.", "description": "helper for inputting hex as decimal input" }, "borrowDharma": { @@ -148,14 +148,14 @@ "message": "아래 주소로 BTC를 입급해주세요." }, "depositCoin": { - "message": "아래 주소로 1달러를 입금해주세요.", + "message": "아래 주소로 $1를 입금해주세요.", "description": "Tells the user what coin they have selected to deposit with shapeshift" }, "depositEth": { - "message": "이더리움 입금" + "message": "이더 입금" }, "depositEther": { - "message": "이더리움 입금" + "message": "이더 입금" }, "depositFiat": { "message": "현금으로 입금하기" @@ -167,7 +167,7 @@ "message": "ShapeShift를 통해 입금하기" }, "depositShapeShiftExplainer": { - "message": "다른 암호화폐를 가지고 있으면, 계좌 생성 필요없이, 거래를 하거나 메타마스크 지갑을 통해 이더리움을 입금할 수 있습니다." + "message": "다른 암호화폐를 가지고 있으면, 계좌 생성 필요없이, 거래를 하거나 메타마스크 지갑을 통해 이더를 입금할 수 있습니다." }, "details": { "message": "상세" @@ -176,10 +176,10 @@ "message": "즉시 입금" }, "directDepositEther": { - "message": "이더리움 즉시 입금" + "message": "이더 즉시 입금" }, "directDepositEtherExplainer": { - "message": "이더리움을 이미 보유하고 있다면, 직접 입금을 통해 이더리움을 즉시 입금하실 수 있습니다." + "message": "이더를 이미 보유하고 있다면, 직접 입금을 통해 이더를 즉시 입금하실 수 있습니다." }, "done": { "message": "완료" @@ -254,14 +254,14 @@ "message": "가스 가격이 필요합니다." }, "getEther": { - "message": "이더리움 얻기" + "message": "이더 얻기" }, "getEtherFromFaucet": { - "message": "faucet에서 1달러에 달하는 이더리움을 얻으세요.", + "message": "faucet에서 $1에 달하는 이더를 얻으세요.", "description": "Displays network name for Ether faucet" }, "greaterThanMin": { - "message": "1 달러 이상이어야 합니다.", + "message": "$1 이상이어야 합니다.", "description": "helper for inputting hex as decimal input" }, "here": { @@ -278,7 +278,7 @@ "message": "토큰 숨기기?" }, "howToDeposit": { - "message": "어떤 방법으로 이더리움을 입금하시겠습니까?" + "message": "어떤 방법으로 이더를 입금하시겠습니까?" }, "import": { "message": "파일에서 가져오기", @@ -320,7 +320,7 @@ "message": "Kovan 테스트넷" }, "lessThanMax": { - "message": "1달러 이하여야합니다.", + "message": "$1 이하여야합니다.", "description": "helper for inputting hex as decimal input" }, "limit": { @@ -354,7 +354,7 @@ "message": "내 계좌" }, "needEtherInWallet": { - "message": "dApp을 이용하기 위해서는 지갑에 이더리움이 있어야 합니다." + "message": "dApp을 이용하기 위해서는 지갑에 이더가 있어야 합니다." }, "needImportFile": { "message": "가져올 파일을 선택해주세요.", @@ -496,7 +496,7 @@ "message": "토큰 전송" }, "sendTokensAnywhere": { - "message": "이더리움 계좌로 토큰 전송" + "message": "이더 계좌로 토큰 전송" }, "settings": { "message": "설정" @@ -541,7 +541,7 @@ "message": "대상" }, "toETHviaShapeShift": { - "message": "ShapeShift를 통해 1 달러를 ETH로 바꾸기", + "message": "ShapeShift를 통해 $1를 ETH로 바꾸기", "description": "system will fill in deposit type in start of message" }, "tokenBalance": { -- cgit From 7432b13b3316086daed125b5991227415932bc3d Mon Sep 17 00:00:00 2001 From: nujabes403 Date: Fri, 16 Mar 2018 14:26:40 +0900 Subject: Update messages.json --- app/_locales/ko/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 75f230cff..24f27fee5 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -200,7 +200,7 @@ "message": "이더스캔에서 계좌보기" }, "exchangeRate": { - "message": "교환비율" + "message": "환율" }, "exportPrivateKey": { "message": "비밀키 내보내기" -- cgit From 0a725285b447f3e14f2d4fa2493590839fd3e00e Mon Sep 17 00:00:00 2001 From: nujabes403 Date: Fri, 16 Mar 2018 14:27:56 +0900 Subject: Update messages.json --- app/_locales/ko/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 24f27fee5..d3801c4f5 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -420,7 +420,7 @@ "description": "in password creation process, the password is not long enough to be secure" }, "pastePrivateKey": { - "message": "비밀키 스트링을 붙여넣어주세요.", + "message": "비밀키를 입력해주세요.", "description": "For importing an account from a private key" }, "pasteSeed": { -- cgit From 51f85b8021a57d1c32d83c4b37c46ca095d22709 Mon Sep 17 00:00:00 2001 From: matteopey Date: Fri, 16 Mar 2018 14:53:57 +0100 Subject: Fix as requested by review --- app/_locales/it/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index f6042ade7..5cf8abae0 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -601,7 +601,7 @@ "message": "Cos'è questo?" }, "yourSigRequested": { - "message": "La tua firma sta venendo richiesta" + "message": "E' richiesta la tua firma" }, "youSign": { "message": "Ti stai connettendo" -- cgit From b3c3f50cf9f0c9fc7e36fd31443fc2cd4c76db77 Mon Sep 17 00:00:00 2001 From: matteopey Date: Fri, 16 Mar 2018 14:55:49 +0100 Subject: Clients because we mean Ethereum clients --- app/_locales/it/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index 5cf8abae0..997e2538d 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -589,7 +589,7 @@ "description": "Usare questo sito di scambio è possibile solo per persone residenti in USA." }, "usedByClients": { - "message": "Usato da una varietà di clienti diversi" + "message": "Usato da una varietà di clients diversi" }, "viewAccount": { "message": "Vedi Account" -- cgit From 7fb27cf0c7a5c8eb2aa492ced603873996537c81 Mon Sep 17 00:00:00 2001 From: Alexander Tseung Date: Fri, 16 Mar 2018 08:50:21 -0700 Subject: Update margins for consistency in first time flow (#3588) --- mascara/src/app/first-time/backup-phrase-screen.js | 42 ++++--- .../app/first-time/import-seed-phrase-screen.js | 129 +++++++++++---------- mascara/src/app/first-time/index.css | 99 +++++++++++----- mascara/src/app/first-time/notice-screen.js | 46 ++++---- mascara/src/app/first-time/unique-image-screen.js | 34 +++--- ui/app/app.js | 14 ++- 6 files changed, 214 insertions(+), 150 deletions(-) diff --git a/mascara/src/app/first-time/backup-phrase-screen.js b/mascara/src/app/first-time/backup-phrase-screen.js index 9db61f3ab..c8cc56c6c 100644 --- a/mascara/src/app/first-time/backup-phrase-screen.js +++ b/mascara/src/app/first-time/backup-phrase-screen.js @@ -89,15 +89,15 @@ class BackupPhraseScreen extends Component { )} - ); + ) } - renderSecretScreen() { + renderSecretScreen () { const { isShowingSecret } = this.state return (
-
+
Secret Backup Phrase
Your secret backup phrase makes it easy to back up and restore your account. @@ -106,17 +106,6 @@ class BackupPhraseScreen extends Component { WARNING: Never disclose your backup phrase. Anyone with this phrase can take your Ether forever.
{this.renderSecretWordsContainer()} - -
Tips:
@@ -130,6 +119,19 @@ class BackupPhraseScreen extends Component { Memorize this phrase.
+
+ + +
) } @@ -231,10 +233,14 @@ class BackupPhraseScreen extends Component { return this.props.isLoading ? : ( -
- {this.renderBack()} - - {this.renderContent()} +
+
+
+ {this.renderBack()} + + {this.renderContent()} +
+
) } diff --git a/mascara/src/app/first-time/import-seed-phrase-screen.js b/mascara/src/app/first-time/import-seed-phrase-screen.js index de8d675e1..86f02ceac 100644 --- a/mascara/src/app/first-time/import-seed-phrase-screen.js +++ b/mascara/src/app/first-time/import-seed-phrase-screen.js @@ -79,70 +79,73 @@ class ImportSeedPhraseScreen extends Component { const { warning } = this.props const importDisabled = warning || !seedPhrase || !password || !confirmPassword return ( -
- { - e.preventDefault() - this.props.back() - }} - href="#" - > - {`< Back`} - -
- Import an Account with Seed Phrase +
+
+
+ { + e.preventDefault() + this.props.back() + }} + href="#" + > + {`< Back`} + +
+ Import an Account with Seed Phrase +
+
+ Enter your secret twelve word phrase here to restore your vault. +
+
+ +