diff options
author | Dan Miller <danjm.com@gmail.com> | 2018-08-16 20:28:27 +0800 |
---|---|---|
committer | Dan Miller <danjm.com@gmail.com> | 2018-12-04 11:36:04 +0800 |
commit | 0a7dfcd55d02a7204d8f0773ff9d91f325aabea8 (patch) | |
tree | a4c7d3e219ca926f17f26d020fddc78854a23b53 /ui/app/selectors/custom-gas.js | |
parent | 112d18e316df312a648b8c8ac17c201314fc9ed6 (diff) | |
download | tangerine-wallet-browser-0a7dfcd55d02a7204d8f0773ff9d91f325aabea8.tar.gz tangerine-wallet-browser-0a7dfcd55d02a7204d8f0773ff9d91f325aabea8.tar.zst tangerine-wallet-browser-0a7dfcd55d02a7204d8f0773ff9d91f325aabea8.zip |
Connect the gas-button-group component to redux and a live api.
Diffstat (limited to 'ui/app/selectors/custom-gas.js')
-rw-r--r-- | ui/app/selectors/custom-gas.js | 186 |
1 files changed, 179 insertions, 7 deletions
diff --git a/ui/app/selectors/custom-gas.js b/ui/app/selectors/custom-gas.js index 97280190f..ff2fd0e05 100644 --- a/ui/app/selectors/custom-gas.js +++ b/ui/app/selectors/custom-gas.js @@ -1,19 +1,191 @@ +import { pipe, partialRight } from 'ramda' +import { + getConversionRate, + getGasLimit, +} from '../components/send/send.selectors' +import { + conversionUtil, + multiplyCurrencies, +} from '../conversion-util' +import { + getCurrentCurrency, +} from '../selectors' +import { + formatCurrency, +} from '../helpers/confirm-transaction/util' +import { + calcGasTotal, +} from '../components/send/send.utils' +import { addHexPrefix } from 'ethereumjs-util' + const selectors = { - getCustomGasPrice, - getCustomGasLimit, getCustomGasErrors, + getCustomGasLimit, + getCustomGasPrice, + getCustomGasTotal, + getRenderableBasicEstimateData, + getBasicGasEstimateLoadingStatus, } module.exports = selectors -function getCustomGasPrice (state) { - return state.customGas.price +function getCustomGasErrors (state) { + return state.gas.errors } function getCustomGasLimit (state) { - return state.customGas.limit + return state.gas.customData.limit } -function getCustomGasErrors (state) { - return state.customGas.errors +function getCustomGasPrice (state) { + return state.gas.customData.price +} + +function getCustomGasTotal (state) { + return state.gas.customData.total +} + +function getBasicGasEstimateLoadingStatus (state) { + return state.gas.basicEstimateIsLoading +} + + +function apiEstimateModifiedToGWEI (estimate) { + return multiplyCurrencies(estimate, 0.10, { + toNumericBase: 'hex', + multiplicandBase: 10, + multiplierBase: 10, + numberOfDecimals: 9, + }) +} + +function basicPriceEstimateToETHTotal (estimate, gasLimit) { + return conversionUtil(calcGasTotal(gasLimit, estimate), { + fromNumericBase: 'hex', + toNumericBase: 'dec', + fromDenomination: 'GWEI', + numberOfDecimals: 9, + }) +} + +function ethTotalToConvertedCurrency (ethTotal, convertedCurrency, conversionRate) { + return conversionUtil(ethTotal, { + fromNumericBase: 'dec', + toNumericBase: 'dec', + fromCurrency: 'ETH', + toCurrency: convertedCurrency, + numberOfDecimals: 2, + conversionRate, + }) +} + +function formatETHFee (ethFee) { + return ethFee + ' ETH' +} + +function getRenderableEthFee (estimate, gasLimit) { + return pipe( + apiEstimateModifiedToGWEI, + partialRight(basicPriceEstimateToETHTotal, [gasLimit]), + formatETHFee + )(estimate, gasLimit) +} + +function getRenderableConvertedCurrencyFee (estimate, gasLimit, convertedCurrency, conversionRate) { + return pipe( + apiEstimateModifiedToGWEI, + partialRight(basicPriceEstimateToETHTotal, [gasLimit]), + partialRight(ethTotalToConvertedCurrency, [convertedCurrency, conversionRate]), + partialRight(formatCurrency, [convertedCurrency]) + )(estimate, gasLimit, convertedCurrency, conversionRate) +} + +function getTimeEstimateInSeconds (blockWaitEstimate, currentBlockTime) { + return multiplyCurrencies(blockWaitEstimate, currentBlockTime, { + toNumericBase: 'dec', + multiplicandBase: 10, + multiplierBase: 10, + numberOfDecimals: 1, + }) +} + +function formatTimeEstimate (totalSeconds) { + const minutes = Math.floor(totalSeconds / 60) + const seconds = Math.floor(totalSeconds % 60) + const formattedMin = `${minutes ? minutes + ' min' : ''}` + const formattedSec = `${seconds ? seconds + ' sec' : ''}` + const formattedCombined = formattedMin && formattedSec + ? `~${formattedMin} ${formattedSec}` + : '~' + [formattedMin, formattedSec].find(t => t) + + return formattedCombined +} + +function getRenderableTimeEstimate (blockWaitEstimate, currentBlockTime) { + return pipe( + getTimeEstimateInSeconds, + formatTimeEstimate + )(blockWaitEstimate, currentBlockTime) +} + +function priceEstimateToWei (priceEstimate) { + return conversionUtil(priceEstimate, { + fromNumericBase: 'hex', + toNumericBase: 'hex', + fromDenomination: 'GWEI', + toDenomination: 'WEI', + numberOfDecimals: 9, + }) +} + +function getGasPriceInHexWei (price) { + return pipe( + apiEstimateModifiedToGWEI, + priceEstimateToWei, + addHexPrefix + )(price) +} + +function getRenderableBasicEstimateData (state) { + if (getBasicGasEstimateLoadingStatus(state)) { + return [] + } + + const gasLimit = getGasLimit(state) + const conversionRate = getConversionRate(state) + const currentCurrency = getCurrentCurrency(state) + const { + gas: { + basicEstimates: { + safeLow, + average, + fast, + blockTime, + safeLowWait, + avgWait, + fastWait, + }, + }, + } = state + + return [ + { + feeInPrimaryCurrency: getRenderableConvertedCurrencyFee(fast, gasLimit, currentCurrency, conversionRate), + feeInSecondaryCurrency: getRenderableEthFee(fast, gasLimit), + timeEstimate: getRenderableTimeEstimate(fastWait, blockTime), + priceInHexWei: getGasPriceInHexWei(fast), + }, + { + feeInPrimaryCurrency: getRenderableConvertedCurrencyFee(average, gasLimit, currentCurrency, conversionRate), + feeInSecondaryCurrency: getRenderableEthFee(average, gasLimit), + timeEstimate: getRenderableTimeEstimate(avgWait, blockTime), + priceInHexWei: getGasPriceInHexWei(average), + }, + { + feeInPrimaryCurrency: getRenderableConvertedCurrencyFee(safeLow, gasLimit, currentCurrency, conversionRate), + feeInSecondaryCurrency: getRenderableEthFee(safeLow, gasLimit), + timeEstimate: getRenderableTimeEstimate(safeLowWait, blockTime), + priceInHexWei: getGasPriceInHexWei(safeLow), + }, + ] } |