mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-23 10:30:04 +01:00
f9cd775eae
* Add estimated time to pending transactions * add sytles for pending transactions component * add media queries styling for pending transactions component * fix lint errors, remove extra spaces * refactor code to call `fetchBasicGasAndTimeEstimates` method once * refactor code to call `getgetRenderableTimeEstimate` method once * fix, correct export to use `transaction-time-remaining-component` * fix indentation issues after running `yarn lint` * newBigSigDig in gas-price-chart.utils supports strings * Code cleanup * Ensure fetchBasicGasAndTimeEstimates is only called from tx-list if there are pending-txs * Move gas time estimate utilities into utility file * Move getTxParams to transaction selector file * Add feature flag for display of remaining transaction time in tx history list * Fix circular dependency by removing unused import of transactionSelector in selectors.js * Use correct feature flag property name transactionTime * Ensure that tx list component correctly responds to turning tx time feature on * Prevent precision errors in newBigSigDig * Code clean up for pending transaction times * Update transaction-time-remaining feature to count down seconds, countdown seconds and show '< 30' * Code clean up for transaction-time-remaining feature
100 lines
3.0 KiB
JavaScript
100 lines
3.0 KiB
JavaScript
import BigNumber from 'bignumber.js'
|
|
|
|
export function newBigSigDig (n) {
|
|
return new BigNumber((new BigNumber(String(n))).toPrecision(15))
|
|
}
|
|
|
|
const createOp = (a, b, op) => (newBigSigDig(a))[op](newBigSigDig(b))
|
|
|
|
export function bigNumMinus (a = 0, b = 0) {
|
|
return createOp(a, b, 'minus')
|
|
}
|
|
|
|
export function bigNumDiv (a = 0, b = 1) {
|
|
return createOp(a, b, 'div')
|
|
}
|
|
|
|
export function extrapolateY ({ higherY = 0, lowerY = 0, higherX = 0, lowerX = 0, xForExtrapolation = 0 }) {
|
|
const slope = bigNumMinus(higherY, lowerY).div(bigNumMinus(higherX, lowerX))
|
|
const newTimeEstimate = slope.times(bigNumMinus(higherX, xForExtrapolation)).minus(newBigSigDig(higherY)).negated()
|
|
|
|
return newTimeEstimate.toNumber()
|
|
}
|
|
|
|
export function getAdjacentGasPrices ({ gasPrices, priceToPosition }) {
|
|
const closestLowerValueIndex = gasPrices.findIndex((e, i, a) => e <= priceToPosition && a[i + 1] >= priceToPosition)
|
|
const closestHigherValueIndex = gasPrices.findIndex((e) => e > priceToPosition)
|
|
return {
|
|
closestLowerValueIndex,
|
|
closestHigherValueIndex,
|
|
closestHigherValue: gasPrices[closestHigherValueIndex],
|
|
closestLowerValue: gasPrices[closestLowerValueIndex],
|
|
}
|
|
}
|
|
|
|
export function formatTimeEstimate (totalSeconds, greaterThanMax, lessThanMin) {
|
|
const minutes = Math.floor(totalSeconds / 60)
|
|
const seconds = Math.floor(totalSeconds % 60)
|
|
|
|
if (!minutes && !seconds) {
|
|
return '...'
|
|
}
|
|
|
|
let symbol = '~'
|
|
if (greaterThanMax) {
|
|
symbol = '< '
|
|
} else if (lessThanMin) {
|
|
symbol = '> '
|
|
}
|
|
|
|
const formattedMin = `${minutes ? minutes + ' min' : ''}`
|
|
const formattedSec = `${seconds ? seconds + ' sec' : ''}`
|
|
const formattedCombined = formattedMin && formattedSec
|
|
? `${symbol}${formattedMin} ${formattedSec}`
|
|
: symbol + (formattedMin || formattedSec)
|
|
|
|
return formattedCombined
|
|
}
|
|
|
|
export function getRawTimeEstimateData (currentGasPrice, gasPrices, estimatedTimes) {
|
|
const minGasPrice = gasPrices[0]
|
|
const maxGasPrice = gasPrices[gasPrices.length - 1]
|
|
let priceForEstimation = currentGasPrice
|
|
if (currentGasPrice < minGasPrice) {
|
|
priceForEstimation = minGasPrice
|
|
} else if (currentGasPrice > maxGasPrice) {
|
|
priceForEstimation = maxGasPrice
|
|
}
|
|
|
|
const {
|
|
closestLowerValueIndex,
|
|
closestHigherValueIndex,
|
|
closestHigherValue,
|
|
closestLowerValue,
|
|
} = getAdjacentGasPrices({ gasPrices, priceToPosition: priceForEstimation })
|
|
|
|
const newTimeEstimate = extrapolateY({
|
|
higherY: estimatedTimes[closestHigherValueIndex],
|
|
lowerY: estimatedTimes[closestLowerValueIndex],
|
|
higherX: closestHigherValue,
|
|
lowerX: closestLowerValue,
|
|
xForExtrapolation: priceForEstimation,
|
|
})
|
|
|
|
return {
|
|
newTimeEstimate,
|
|
minGasPrice,
|
|
maxGasPrice,
|
|
}
|
|
}
|
|
|
|
export function getRenderableTimeEstimate (currentGasPrice, gasPrices, estimatedTimes) {
|
|
const {
|
|
newTimeEstimate,
|
|
minGasPrice,
|
|
maxGasPrice,
|
|
} = getRawTimeEstimateData(currentGasPrice, gasPrices, estimatedTimes)
|
|
|
|
return formatTimeEstimate(newTimeEstimate, currentGasPrice > maxGasPrice, currentGasPrice < minGasPrice)
|
|
}
|