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