A Metamask fork with Infura removed and default networks editable
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ciphermask/ui/app/helpers/utils/gas-time-estimates.util.js

126 lines
3.1 KiB

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,
)
}