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.
189 lines
4.9 KiB
189 lines
4.9 KiB
import currencyFormatter from 'currency-formatter';
|
|
import currencies from 'currency-formatter/currencies';
|
|
import BigNumber from 'bignumber.js';
|
|
import { addHexPrefix } from '../../../app/scripts/lib/util';
|
|
|
|
import { unconfirmedTransactionsCountSelector } from '../../selectors';
|
|
import {
|
|
conversionUtil,
|
|
addCurrencies,
|
|
multiplyCurrencies,
|
|
conversionGreaterThan,
|
|
} from '../../../shared/modules/conversion.utils';
|
|
|
|
export function increaseLastGasPrice(lastGasPrice) {
|
|
return addHexPrefix(
|
|
multiplyCurrencies(lastGasPrice || '0x0', 1.1, {
|
|
multiplicandBase: 16,
|
|
multiplierBase: 10,
|
|
toNumericBase: 'hex',
|
|
}),
|
|
);
|
|
}
|
|
|
|
export function hexGreaterThan(a, b) {
|
|
return conversionGreaterThan(
|
|
{ value: a, fromNumericBase: 'hex' },
|
|
{ value: b, fromNumericBase: 'hex' },
|
|
);
|
|
}
|
|
|
|
export function getHexGasTotal({ gasLimit, gasPrice }) {
|
|
return addHexPrefix(
|
|
multiplyCurrencies(gasLimit || '0x0', gasPrice || '0x0', {
|
|
toNumericBase: 'hex',
|
|
multiplicandBase: 16,
|
|
multiplierBase: 16,
|
|
}),
|
|
);
|
|
}
|
|
|
|
export function addEth(...args) {
|
|
return args.reduce((acc, ethAmount) => {
|
|
return addCurrencies(acc, ethAmount, {
|
|
toNumericBase: 'dec',
|
|
numberOfDecimals: 6,
|
|
aBase: 10,
|
|
bBase: 10,
|
|
});
|
|
});
|
|
}
|
|
|
|
export function addFiat(...args) {
|
|
return args.reduce((acc, fiatAmount) => {
|
|
return addCurrencies(acc, fiatAmount, {
|
|
toNumericBase: 'dec',
|
|
numberOfDecimals: 2,
|
|
aBase: 10,
|
|
bBase: 10,
|
|
});
|
|
});
|
|
}
|
|
|
|
export function getValueFromWeiHex({
|
|
value,
|
|
fromCurrency = 'ETH',
|
|
toCurrency,
|
|
conversionRate,
|
|
numberOfDecimals,
|
|
toDenomination,
|
|
}) {
|
|
return conversionUtil(value, {
|
|
fromNumericBase: 'hex',
|
|
toNumericBase: 'dec',
|
|
fromCurrency,
|
|
toCurrency,
|
|
numberOfDecimals,
|
|
fromDenomination: 'WEI',
|
|
toDenomination,
|
|
conversionRate,
|
|
});
|
|
}
|
|
|
|
export function getTransactionFee({
|
|
value,
|
|
fromCurrency = 'ETH',
|
|
toCurrency,
|
|
conversionRate,
|
|
numberOfDecimals,
|
|
}) {
|
|
return conversionUtil(value, {
|
|
fromNumericBase: 'BN',
|
|
toNumericBase: 'dec',
|
|
fromDenomination: 'WEI',
|
|
fromCurrency,
|
|
toCurrency,
|
|
numberOfDecimals,
|
|
conversionRate,
|
|
});
|
|
}
|
|
|
|
export function formatCurrency(value, currencyCode) {
|
|
const upperCaseCurrencyCode = currencyCode.toUpperCase();
|
|
|
|
return currencies.find((currency) => currency.code === upperCaseCurrencyCode)
|
|
? currencyFormatter.format(Number(value), {
|
|
code: upperCaseCurrencyCode,
|
|
style: 'currency',
|
|
})
|
|
: value;
|
|
}
|
|
|
|
export function convertTokenToFiat({
|
|
value,
|
|
fromCurrency = 'ETH',
|
|
toCurrency,
|
|
conversionRate,
|
|
contractExchangeRate,
|
|
}) {
|
|
const totalExchangeRate = conversionRate * contractExchangeRate;
|
|
|
|
return conversionUtil(value, {
|
|
fromNumericBase: 'dec',
|
|
toNumericBase: 'dec',
|
|
fromCurrency,
|
|
toCurrency,
|
|
numberOfDecimals: 2,
|
|
conversionRate: totalExchangeRate,
|
|
});
|
|
}
|
|
|
|
export function hasUnconfirmedTransactions(state) {
|
|
return unconfirmedTransactionsCountSelector(state) > 0;
|
|
}
|
|
|
|
/**
|
|
* Rounds the given decimal string to 4 significant digits.
|
|
*
|
|
* @param {string} decimalString - The base-ten number to round.
|
|
* @returns {string} The rounded number, or the original number if no
|
|
* rounding was necessary.
|
|
*/
|
|
export function roundExponential(decimalString) {
|
|
const PRECISION = 4;
|
|
const bigNumberValue = new BigNumber(decimalString);
|
|
|
|
// In JS, numbers with exponentials greater than 20 get displayed as an exponential.
|
|
return bigNumberValue.e > 20
|
|
? bigNumberValue.toPrecision(PRECISION)
|
|
: decimalString;
|
|
}
|
|
|
|
export function areDappSuggestedAndTxParamGasFeesTheSame(txData = {}) {
|
|
const { txParams, dappSuggestedGasFees } = txData;
|
|
const {
|
|
gasPrice: txParamsGasPrice,
|
|
maxFeePerGas: txParamsMaxFeePerGas,
|
|
maxPriorityFeePerGas: txParamsMaxPriorityFeePerGas,
|
|
} = txParams || {};
|
|
const {
|
|
gasPrice: dappGasPrice,
|
|
maxFeePerGas: dappMaxFeePerGas,
|
|
maxPriorityFeePerGas: dappMaxPriorityFeePerGas,
|
|
} = dappSuggestedGasFees || {};
|
|
|
|
const txParamsDoesNotHaveFeeProperties =
|
|
!txParamsGasPrice && !txParamsMaxFeePerGas && !txParamsMaxPriorityFeePerGas;
|
|
const dappDidNotSuggestFeeProperties =
|
|
!dappGasPrice && !dappMaxFeePerGas && !dappMaxPriorityFeePerGas;
|
|
if (txParamsDoesNotHaveFeeProperties || dappDidNotSuggestFeeProperties) {
|
|
return false;
|
|
}
|
|
|
|
const txParamsGasPriceMatchesDappSuggestedGasPrice =
|
|
txParamsGasPrice && txParamsGasPrice === dappGasPrice;
|
|
const txParamsEIP1559FeesMatchDappSuggestedGasPrice = [
|
|
txParamsMaxFeePerGas,
|
|
txParamsMaxPriorityFeePerGas,
|
|
].every((fee) => fee === dappGasPrice);
|
|
const txParamsEIP1559FeesMatchDappSuggestedEIP1559Fees =
|
|
txParamsMaxFeePerGas &&
|
|
txParamsMaxFeePerGas === dappMaxFeePerGas &&
|
|
txParamsMaxPriorityFeePerGas === dappMaxPriorityFeePerGas;
|
|
|
|
return (
|
|
txParamsGasPriceMatchesDappSuggestedGasPrice ||
|
|
txParamsEIP1559FeesMatchDappSuggestedGasPrice ||
|
|
txParamsEIP1559FeesMatchDappSuggestedEIP1559Fees
|
|
);
|
|
}
|
|
|