diff --git a/assets/mainWindow/css/loading.css b/assets/mainWindow/css/loading.css index ce2afc51d..3e5808228 100644 --- a/assets/mainWindow/css/loading.css +++ b/assets/mainWindow/css/loading.css @@ -175,6 +175,7 @@ body.agama-app-settings-window { top: 0; right: 0; cursor: pointer; + z-index: 100; } .btn-close img { @@ -466,4 +467,47 @@ small { .padding-top-40 { padding-top: 40px; +} + +.agama-modes-help { + background: rgba(255, 255, 255, 0.85); + width: 420px; + height: auto; + position: absolute; + color: #000; + border-radius: 4px; + font-weight: normal; + font-size: 14px; + text-align: left; + padding: 10px; + top: 60px; + left: 40px; + z-index: 1000; +} + +.agama-modes-help .close-btn { + float: right; + width: 10px; + height: 10px; + cursor: pointer; +} + +.pointer { + cursor: pointer; +} + +.mode-desc { + top: 173px; + position: absolute; +} +.mode-desc.native { + left: 88px; +} +.mode-desc.spv { + left: 293px; +} + +.intro { + position: relative; + top: -15px; } \ No newline at end of file diff --git a/assets/mainWindow/js/loading.js b/assets/mainWindow/js/loading.js index 83063a583..10fce4375 100644 --- a/assets/mainWindow/js/loading.js +++ b/assets/mainWindow/js/loading.js @@ -1,6 +1,16 @@ // TODO: merge into react app let _configCopy; +function toggleMainWindowHelp() { + const _help = $('.agama-modes-help'); + + if (_help.is(':visible')) { + _help.hide(); + } else { + _help.show(); + } +} + function toggleDropdown(type) { const _dropdown = $('.dropdown-menu.' + (type === 'lite' ? 'lite' : 'native')); @@ -10,7 +20,7 @@ function toggleDropdown(type) { _dropdown.addClass('hide'); } - $('.dropdown-menu.' + (type === 'lite' ? 'native' : 'lite')).addClass('hide');; + $('.dropdown-menu.' + (type === 'lite' ? 'native' : 'lite')).addClass('hide'); } function initSettingsForm() { diff --git a/react/src/actions/actionCreators.js b/react/src/actions/actionCreators.js index ff46bf5a5..8df7dbf9f 100644 --- a/react/src/actions/actionCreators.js +++ b/react/src/actions/actionCreators.js @@ -29,6 +29,7 @@ import { DISPLAY_IMPORT_KEY_MODAL, ELECTRUM_SERVER_CHANGED, DISPLAY_ZCASH_PARAMS_FETCH, + DASHBOARD_REMOVE_COIN, } from './storeType'; export * from './actions/nativeSyncInfo'; @@ -288,4 +289,11 @@ export function toggleZcparamsFetchModal(display) { type: DISPLAY_ZCASH_PARAMS_FETCH, displayZcparamsModal: display, } +} + +export function dashboardRemoveCoin(coin) { + return { + type: DASHBOARD_REMOVE_COIN, + coin, + } } \ No newline at end of file diff --git a/react/src/actions/actions/coinList.js b/react/src/actions/actions/coinList.js index 7a69e197e..034ba0c16 100644 --- a/react/src/actions/actions/coinList.js +++ b/react/src/actions/actions/coinList.js @@ -147,4 +147,27 @@ export function shepherdPostCoinList(data) { .then(response => response.json()) .then(json => resolve(json)) }); +} + +export function shepherdClearCoindFolder(coin, keepWalletDat) { + return new Promise((resolve, reject) => { + fetch(keepWalletDat ? `http://127.0.0.1:${Config.agamaPort}/shepherd/kick?coin=${coin}&keepwallet=true` : `http://127.0.0.1:${Config.agamaPort}/shepherd/kick?coin=${coin}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }) + .catch((error) => { + console.log(error); + dispatch( + triggerToaster( + 'shepherdClearCoindFolder', + 'Error', + 'error' + ) + ); + }) + .then(response => response.json()) + .then(json => resolve(json)) + }); } \ No newline at end of file diff --git a/react/src/actions/actions/interest.js b/react/src/actions/actions/interest.js index 49742c148..b994d0d70 100644 --- a/react/src/actions/actions/interest.js +++ b/react/src/actions/actions/interest.js @@ -35,6 +35,20 @@ export function getListUnspent(coin) { }) .then(response => response.json()) .then(json => { + if (json && + json.result && + json.result.length) { + let _spendable = []; + + for (let i = 0; i < json.result.length; i++) { + if (json.result[i].spendable) { + _spendable.push(json.result[i]); + } + } + + json.result = _spendable; + } + resolve(json.result ? json.result : json); }) }); diff --git a/react/src/actions/actions/nativeDashboardUpdate.js b/react/src/actions/actions/nativeDashboardUpdate.js index af3cd75a1..b9f269a91 100644 --- a/react/src/actions/actions/nativeDashboardUpdate.js +++ b/react/src/actions/actions/nativeDashboardUpdate.js @@ -45,10 +45,10 @@ export function getDashboardUpdate(coin, activeCoinProps) { export function getDashboardUpdateState(json, coin, fakeResponse) { // rescan or similar resource heavy process if (fakeResponse || - ((json.result['getinfo'].error && json.result['getinfo'].error === 'daemon is busy') && - (json.result['z_getoperationstatus'].error && json.result['z_getoperationstatus'].error === 'daemon is busy') && - (json.result['listtransactions'].error && json.result['listtransactions'].error === 'daemon is busy') && - (json.result['listtransactions'].error && json.result['listtransactions'].error === 'daemon is busy'))) { + ((json.result.getinfo.error && json.result.getinfo.error === 'daemon is busy') && + (json.result.z_getoperationstatus.error && json.result.z_getoperationstatus.error === 'daemon is busy') && + (json.result.listtransactions.error && json.result.listtransactions.error === 'daemon is busy') && + (json.result.listtransactions.error && json.result.listtransactions.error === 'daemon is busy'))) { return { type: DASHBOARD_UPDATE, progress: null, @@ -60,7 +60,7 @@ export function getDashboardUpdateState(json, coin, fakeResponse) { rescanInProgress: true, }; } else { - let _listtransactions = json.result['listtransactions']; + let _listtransactions = json.result.listtransactions; if (_listtransactions && _listtransactions.error) { @@ -74,22 +74,40 @@ export function getDashboardUpdateState(json, coin, fakeResponse) { if (coin === 'CHIPS') { return { type: DASHBOARD_UPDATE, - progress: json.result['getinfo'].result, + progress: json.result.getinfo.result, opids: null, txhistory: _listtransactions, - balance: { transparent: json.result['getbalance'].result, total: json.result['getbalance'].result }, - addresses: json.result['addresses'], + balance: { + transparent: json.result.getbalance.result, + total: json.result.getbalance.result + }, + addresses: json.result.addresses, coin: coin, rescanInProgress: false, }; } else { + // calc transparent balance properly + let _tbalance = 0; + + if (json.result.addresses && + json.result.addresses.public && + json.result.addresses.public.length) { + for (let i = 0; i < json.result.addresses.public.length; i++) { + _tbalance += json.result.addresses.public[i].spendable; + } + } + + json.result.z_gettotalbalance.result.transparent = _tbalance.toFixed(8); + json.result.z_gettotalbalance.result.total = Number(json.result.z_gettotalbalance.result.transparent) + Number(json.result.z_gettotalbalance.result.interest) + Number(json.result.z_gettotalbalance.result.private); + json.result.z_gettotalbalance.result.total = json.result.z_gettotalbalance.result.total.toFixed(8); + return { type: DASHBOARD_UPDATE, - progress: json.result['getinfo'].result, - opids: json.result['z_getoperationstatus'].result, + progress: json.result.getinfo.result, + opids: json.result.z_getoperationstatus.result, txhistory: _listtransactions, - balance: json.result['z_gettotalbalance'].result, - addresses: json.result['addresses'], + balance: json.result.z_gettotalbalance.result, + addresses: json.result.addresses, coin: coin, rescanInProgress: false, }; diff --git a/react/src/actions/storeType.js b/react/src/actions/storeType.js index f3860b385..02c3c1054 100644 --- a/react/src/actions/storeType.js +++ b/react/src/actions/storeType.js @@ -46,4 +46,5 @@ export const DASHBOARD_ELECTRUM_BALANCE = 'DASHBOARD_ELECTRUM_BALANCE'; export const DASHBOARD_ELECTRUM_TRANSACTIONS = 'DASHBOARD_ELECTRUM_TRANSACTIONS'; export const DASHBOARD_ELECTRUM_COINS = 'DASHBOARD_ELECTRUM_COINS'; export const ELECTRUM_SERVER_CHANGED = 'ELECTRUM_SERVER_CHANGED'; -export const DISPLAY_ZCASH_PARAMS_FETCH = 'DISPLAY_ZCASH_PARAMS_FETCH'; \ No newline at end of file +export const DISPLAY_ZCASH_PARAMS_FETCH = 'DISPLAY_ZCASH_PARAMS_FETCH'; +export const DASHBOARD_REMOVE_COIN = 'DASHBOARD_REMOVE_COIN'; \ No newline at end of file diff --git a/react/src/components/dashboard/claimInterestModal/claimInterestModal.js b/react/src/components/dashboard/claimInterestModal/claimInterestModal.js index 8fe21d3ea..002358704 100755 --- a/react/src/components/dashboard/claimInterestModal/claimInterestModal.js +++ b/react/src/components/dashboard/claimInterestModal/claimInterestModal.js @@ -8,7 +8,7 @@ import { getRawTransaction, copyString, sendToAddressPromise, - triggerToaster + triggerToaster, } from '../../../actions/actionCreators'; import { translate } from '../../../translate/translate'; import { diff --git a/react/src/components/dashboard/coinTile/coinTileItem.js b/react/src/components/dashboard/coinTile/coinTileItem.js index 12b824143..c4adf7aa4 100644 --- a/react/src/components/dashboard/coinTile/coinTileItem.js +++ b/react/src/components/dashboard/coinTile/coinTileItem.js @@ -25,6 +25,7 @@ import { triggerToaster, shepherdRemoveCoin, toggleCoindDownModal, + dashboardRemoveCoin, } from '../../../actions/actionCreators'; import Store from '../../../store'; import Config from '../../../config'; @@ -94,9 +95,9 @@ class CoinTileItem extends React.Component { ]; const allCoins = this.props.Main.coins; let _coinSelected = false; + let _coinMode = {}; let _mode; let _coin; - let _coinMode = {}; if (allCoins) { modes.map((mode) => { @@ -151,6 +152,8 @@ class CoinTileItem extends React.Component { 'success' ) ); + + Store.dispatch(dashboardRemoveCoin(coin)); Store.dispatch(getDexCoins()); Store.dispatch(activeHandle()); setTimeout(() => { @@ -179,6 +182,7 @@ class CoinTileItem extends React.Component { ) ); + Store.dispatch(dashboardRemoveCoin(coin)); Store.dispatch(getDexCoins()); Store.dispatch(activeHandle()); setTimeout(() => { diff --git a/react/src/components/dashboard/coindDownModal/coindDownModal.scss b/react/src/components/dashboard/coindDownModal/coindDownModal.scss index 179ecd4f7..c7abbf38d 100644 --- a/react/src/components/dashboard/coindDownModal/coindDownModal.scss +++ b/react/src/components/dashboard/coindDownModal/coindDownModal.scss @@ -9,6 +9,7 @@ &.form-material { &.floating { height: 80%; + max-height: calc(100% - 100px); } } } diff --git a/react/src/components/dashboard/receiveCoin/receiveCoin.js b/react/src/components/dashboard/receiveCoin/receiveCoin.js index ab8440e8b..a9ce8401d 100644 --- a/react/src/components/dashboard/receiveCoin/receiveCoin.js +++ b/react/src/components/dashboard/receiveCoin/receiveCoin.js @@ -23,6 +23,7 @@ class ReceiveCoin extends React.Component { openDropMenu: false, hideZeroAdresses: false, toggledAddressMenu: null, + toggleIsMine: false, }; this.openDropMenu = this.openDropMenu.bind(this); this.handleClickOutside = this.handleClickOutside.bind(this); @@ -30,6 +31,7 @@ class ReceiveCoin extends React.Component { this.checkTotalBalance = this.checkTotalBalance.bind(this); this.ReceiveCoinTableRender = _ReceiveCoinTableRender.bind(this); this.toggleAddressMenu = this.toggleAddressMenu.bind(this); + this.toggleIsMine = this.toggleIsMine.bind(this); } toggleAddressMenu(address) { @@ -119,6 +121,12 @@ class ReceiveCoin extends React.Component { })); } + toggleIsMine() { + this.setState(Object.assign({}, this.state, { + toggleIsMine: !this.state.toggleIsMine, + })); + } + checkTotalBalance() { let _balance = '0'; @@ -147,10 +155,20 @@ class ReceiveCoin extends React.Component { AddressItemRender.call(this, address, type) ); } + + if (!this.state.toggleIsMine && + !address.canspend) { + items.pop(); + } } else { items.push( AddressItemRender.call(this, address, type) ); + + if (!this.state.toggleIsMine && + !address.canspend) { + items.pop(); + } } } diff --git a/react/src/components/dashboard/receiveCoin/receiveCoin.render.js b/react/src/components/dashboard/receiveCoin/receiveCoin.render.js index c8915b95e..e4c4b7ce4 100644 --- a/react/src/components/dashboard/receiveCoin/receiveCoin.render.js +++ b/react/src/components/dashboard/receiveCoin/receiveCoin.render.js @@ -24,7 +24,7 @@ export const AddressActionsNonBasiliskModeRender = function(address, type) {
  • this._copyCoinAddress(address) }> { translate('INDEX.COPY') + ' pub key' }
  • - { address[0] !== 'b' && + { !address.canspend &&
  • this.dumpPrivKey(address) }> { translate('INDEX.COPY') + ' priv key (WIF)' }
  • @@ -43,8 +43,20 @@ export const AddressItemRender = function(address, type) { return ( { this.renderAddressActions(address.address, type) } - { type === 'public' ? address.address : `${address.address.substring(0, 34)}...` } - { address.amount } + + { type === 'public' ? address.address : `${address.address.substring(0, 34)}...` } + { !address.canspend && + + } + + + { address.amount } + { !address.canspend && + (0) + } + ); }; @@ -53,7 +65,7 @@ export const _ReceiveCoinTableRender = function() { return ( { this.checkTotalBalance() !== 0 && -
    +
    { this.props.mode !== 'spv' &&
    } + { this.checkTotalBalance() !== 0 && +
    + { this.props.mode !== 'spv' && +
    + +
    + Show all addresses +
    +
    + } +
    + } diff --git a/react/src/components/dashboard/sendCoin/sendCoin.js b/react/src/components/dashboard/sendCoin/sendCoin.js index e77e35f66..cd7528841 100644 --- a/react/src/components/dashboard/sendCoin/sendCoin.js +++ b/react/src/components/dashboard/sendCoin/sendCoin.js @@ -36,7 +36,7 @@ class SendCoin extends React.Component { fee: 0, addressSelectorOpen: false, renderAddressDropdown: true, - substractFee: false, + subtractFee: false, lastSendToResponse: null, coin: null, spvVerificationWarning: false, @@ -51,7 +51,7 @@ class SendCoin extends React.Component { this.renderOPIDListCheck = this.renderOPIDListCheck.bind(this); this.SendFormRender = _SendFormRender.bind(this); this.isTransparentTx = this.isTransparentTx.bind(this); - this.toggleSubstractFee = this.toggleSubstractFee.bind(this); + this.toggleSubtractFee = this.toggleSubtractFee.bind(this); this.isFullySynced = this.isFullySynced.bind(this); } @@ -59,9 +59,9 @@ class SendCoin extends React.Component { return _SendFormRender.call(this); } - toggleSubstractFee() { + toggleSubtractFee() { this.setState({ - substractFee: !this.state.substractFee, + subtractFee: !this.state.subtractFee, }); } @@ -147,7 +147,7 @@ class SendCoin extends React.Component { fee: 0, addressSelectorOpen: false, renderAddressDropdown: true, - substractFee: false, + subtractFee: false, lastSendToResponse: null, }; let updatedState; @@ -365,7 +365,7 @@ class SendCoin extends React.Component { fee: 0, addressSelectorOpen: false, renderAddressDropdown: true, - substractFee: false, + subtractFee: false, spvVerificationWarning: false, spvPreflightSendInProgress: false, }); @@ -460,10 +460,10 @@ class SendCoin extends React.Component { const _amountSats = this.state.amount * 100000000; const _balanceSats = this.props.ActiveCoin.balance.balanceSats; - if (_amountSats > _balanceSats) { + if (Number(_amountSats) + 10000 > _balanceSats) { Store.dispatch( triggerToaster( - translate('SEND.INSUFFICIENT_FUNDS'), + `${translate('SEND.INSUFFICIENT_FUNDS')} max available balance is ${(0.00000001 * (_balanceSats - 10000)).toFixed(8)} ${this.props.ActiveCoin.coin}`, translate('TOASTR.WALLET_NOTIFICATION'), 'error' ) @@ -500,18 +500,18 @@ class SendCoin extends React.Component { this.state.sendTo.length === 34 && this.props.ActiveCoin.balance && this.props.ActiveCoin.balance.transparent && - Number(this.state.amount) > Number(this.props.ActiveCoin.balance.transparent)) || + Number(Number(this.state.amount) + 0.0001) > Number(this.props.ActiveCoin.balance.transparent)) || (this.state.addressType === 'public' && this.state.sendTo && this.state.sendTo.length > 34 && - Number(this.state.amount) > Number(this.state.sendFromAmount)) || + Number(Number(this.state.amount) + 0.0001) > Number(this.state.sendFromAmount)) || (this.state.addressType === 'private' && this.state.sendTo && this.state.sendTo.length >= 34 && - Number(this.state.amount) > Number(this.state.sendFromAmount))) { + Number(Number(this.state.amount) + 0.0001) > Number(this.state.sendFromAmount))) { Store.dispatch( triggerToaster( - translate('SEND.INSUFFICIENT_FUNDS'), + `${translate('SEND.INSUFFICIENT_FUNDS')} max available balance is ${Number(this.state.sendFromAmount || this.props.ActiveCoin.balance.transparent)} ${this.props.ActiveCoin.coin}`, translate('TOASTR.WALLET_NOTIFICATION'), 'error' ) diff --git a/react/src/components/dashboard/sendCoin/sendCoin.render.js b/react/src/components/dashboard/sendCoin/sendCoin.render.js index e84f7f845..b02ed1d67 100644 --- a/react/src/components/dashboard/sendCoin/sendCoin.render.js +++ b/react/src/components/dashboard/sendCoin/sendCoin.render.js @@ -85,15 +85,15 @@ export const _SendFormRender = function() {
    this.toggleSubstractFee() }> - { translate('DASHBOARD.SUBSTRACT_FEE') } + onClick={ () => this.toggleSubtractFee() }> + { translate('DASHBOARD.SUBTRACT_FEE') }
    @@ -206,7 +206,7 @@ export const SendRender = function() {
    { this.state.amount } { this.props.ActiveCoin.coin }
    -
    { translate('DASHBOARD.SUBSTRACT_FEE') }
    +
    { translate('DASHBOARD.SUBTRACT_FEE') }
    { this.state.sendFrom && diff --git a/react/src/components/dashboard/settings/settings.coindClearDataDirPanel.js b/react/src/components/dashboard/settings/settings.coindClearDataDirPanel.js new file mode 100644 index 000000000..3ce9de27d --- /dev/null +++ b/react/src/components/dashboard/settings/settings.coindClearDataDirPanel.js @@ -0,0 +1,166 @@ +import React from 'react'; +import { translate } from '../../../translate/translate'; +import { + shepherdClearCoindFolder, + triggerToaster +} from '../../../actions/actionCreators'; +import { coindList } from '../../../util/coinHelper'; +import Store from '../../../store'; + +class CoindClearDataDirPanel extends React.Component { + constructor() { + super(); + this.state = { + coin: 'none', + keepWalletDat: true, + loading: false, + displayYesNo: false, + }; + this.removeCoindData = this.removeCoindData.bind(this); + this.updateInput = this.updateInput.bind(this); + this.toggleKeepWalletDat = this.toggleKeepWalletDat.bind(this); + this.displayYesNo = this.displayYesNo.bind(this); + } + + displayYesNo() { + this.setState({ + displayYesNo: !this.state.displayYesNo, + }); + } + + removeCoindData() { + const _coin = this.state.coin; + + this.setState({ + loading: true, + displayYesNo: false, + }); + + setTimeout(() => { + shepherdClearCoindFolder(_coin, this.state.keepWalletDat ? this.state.keepWalletDat : null) + .then((res) => { + if (res.msg === 'success') { + this.setState({ + keepWalletDat: true, + loading: false, + }); + + Store.dispatch( + triggerToaster( + `${_coin} data folder is cleared`, + translate('TOASTR.WALLET_NOTIFICATION'), + 'success' + ) + ); + } else { + Store.dispatch( + triggerToaster( + `Unable to clear ${_coin}`, + translate('TOASTR.WALLET_NOTIFICATION'), + 'error' + ) + ); + } + }); + }, 100); + } + + updateInput(e) { + this.setState({ + [e.target.name]: e.target.value, + }); + } + + toggleKeepWalletDat() { + this.setState(Object.assign({}, this.state, { + keepWalletDat: !this.state.keepWalletDat, + })); + } + + renderCoinListSelectorOptions() { + let _items = []; + let _nativeCoins = coindList(); + + _items.push( + + ); + for (let i = 0; i < _nativeCoins.length; i++) { + if (_nativeCoins[i] !== 'CHIPS') { + _items.push( + + ); + } + } + + return _items; + } + + render() { + return ( +
    +
    +
    +

    + Warning: the following form will wipe out all native coin data!
    Don't touch anything if you're not sure what you're doing. +

    +
    +
    + + + + Keep wallet.dat + + { !this.state.displayYesNo && + + } + { this.state.displayYesNo && +
    Are you sure you want to clear {this.state.coin} data folder?
    + } + { this.state.displayYesNo && + + } + { this.state.displayYesNo && + + } +
    +
    +
    +
    +
    + ); + }; +} + +export default CoindClearDataDirPanel; \ No newline at end of file diff --git a/react/src/components/dashboard/settings/settings.render.js b/react/src/components/dashboard/settings/settings.render.js index 49fa7c53e..3f6176f86 100644 --- a/react/src/components/dashboard/settings/settings.render.js +++ b/react/src/components/dashboard/settings/settings.render.js @@ -16,6 +16,7 @@ import SupportPanel from './settings.supportPanel'; import SPVServersPanel from './settings.spvServersPanel'; import DaemonStdoutPanel from './settings.daemonStdoutPanel'; import NativeWalletDatKeysPanel from './settings.nativeWalletDatKeysPanel'; +import CoindClearDataDirPanel from './settings.coindClearDataDirPanel'; // import WalletInfoPanel from './settings.walletInfoPanel'; // import WalletBackupPanel from './settings.walletBackupPanel'; @@ -110,6 +111,11 @@ export const SettingsRender = function() { icon="icon md-key"> + + + { this.props.Main.coins && this.props.Main.coins.spv && Object.keys(this.props.Main.coins.spv).length && diff --git a/react/src/components/overrides.scss b/react/src/components/overrides.scss index 62ea340d4..4d72e01b3 100644 --- a/react/src/components/overrides.scss +++ b/react/src/components/overrides.scss @@ -591,4 +591,29 @@ select{ cursor: default; } } +} + +.push-right { + float: right; +} +.push-left { + float: left; +} + +.col-lg-12 { + &.col-xs-12 { + &.balance-placeholder--bold { + .icon { + &.fa-eye { + position: relative; + top: -2px; + padding-right: 5px; + } + } + } + } +} + +.col-red { + color: #f96868; } \ No newline at end of file diff --git a/react/src/reducers/activeCoin.js b/react/src/reducers/activeCoin.js index 4b88843f0..07b1b557b 100644 --- a/react/src/reducers/activeCoin.js +++ b/react/src/reducers/activeCoin.js @@ -17,6 +17,7 @@ import { DASHBOARD_UPDATE, DASHBOARD_ELECTRUM_BALANCE, DASHBOARD_ELECTRUM_TRANSACTIONS, + DASHBOARD_REMOVE_COIN, } from '../actions/storeType'; // TODO: refactor current coin props copy on change @@ -40,6 +41,13 @@ export function ActiveCoin(state = { getinfoFetchFailures: 0, }, action) { switch (action.type) { + case DASHBOARD_REMOVE_COIN: + let _coins = state.coins; + delete _coins[action.coin]; + return { + ...state, + coins: _coins, + } case DASHBOARD_ACTIVE_COIN_CHANGE: if (state.coins[action.coin]) { const _coinData = state.coins[action.coin]; diff --git a/react/src/translate/en.js b/react/src/translate/en.js index 89591f20b..e445a5e33 100644 --- a/react/src/translate/en.js +++ b/react/src/translate/en.js @@ -440,7 +440,7 @@ export const _lang = { 'SEND_FEE_REQ': 'Make sure you have fee entered. Default value is', 'SEND_TOTAL_REQ': 'Make sure you have both amount and fee entered to calculate final total.', 'SEND_TX_PROGRESS': 'The transaction submitted is processing. Once processed the transaction details will be displayed here.', - 'SUBSTRACT_FEE': 'Subtract fee from amount', + 'SUBTRACT_FEE': 'Subtract fee from amount', 'UNKNOWN': 'Unknown', 'IN': 'IN', 'OUT': 'OUT',