mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-01 21:57:06 +01:00
109 lines
3.4 KiB
JavaScript
109 lines
3.4 KiB
JavaScript
import { useSelector } from 'react-redux';
|
|
|
|
import { EditGasModes, GasEstimateTypes } from '../../../shared/constants/gas';
|
|
import {
|
|
getMaximumGasTotalInHexWei,
|
|
getMinimumGasTotalInHexWei,
|
|
} from '../../../shared/modules/gas.utils';
|
|
|
|
import { PRIMARY } from '../../helpers/constants/common';
|
|
import { checkNetworkAndAccountSupports1559 } from '../../selectors';
|
|
import { isLegacyTransaction } from '../../helpers/utils/transactions.util';
|
|
|
|
import { useCurrencyDisplay } from '../useCurrencyDisplay';
|
|
import { useUserPreferencedCurrency } from '../useUserPreferencedCurrency';
|
|
import {
|
|
decGWEIToHexWEI,
|
|
decimalToHex,
|
|
} from '../../../shared/modules/conversion.utils';
|
|
|
|
/**
|
|
* @typedef {object} GasEstimatesReturnType
|
|
* @property {string} [estimatedMinimumNative] - the maximum amount estimated to be paid if the
|
|
* current network transaction volume increases. Expressed in the network's native currency.
|
|
* @property {HexWeiString} [maximumCostInHexWei] - the maximum amount this transaction will cost.
|
|
* @property {HexWeiString} [minimumCostInHexWei] - the minimum amount this transaction will cost.
|
|
*/
|
|
|
|
/**
|
|
* @param options
|
|
* @param options.editGasMode
|
|
* @param options.gasEstimateType
|
|
* @param options.gasFeeEstimates
|
|
* @param options.gasLimit
|
|
* @param options.gasPrice
|
|
* @param options.maxFeePerGas
|
|
* @param options.maxPriorityFeePerGas
|
|
* @param options.minimumGasLimit
|
|
* @param options.transaction
|
|
* @returns {GasEstimatesReturnType} The gas estimates.
|
|
*/
|
|
export function useGasEstimates({
|
|
editGasMode,
|
|
gasEstimateType,
|
|
gasFeeEstimates,
|
|
gasLimit,
|
|
gasPrice,
|
|
maxFeePerGas,
|
|
maxPriorityFeePerGas,
|
|
minimumGasLimit,
|
|
transaction,
|
|
}) {
|
|
const supportsEIP1559 =
|
|
useSelector(checkNetworkAndAccountSupports1559) &&
|
|
!isLegacyTransaction(transaction?.txParams);
|
|
|
|
const {
|
|
currency: primaryCurrency,
|
|
numberOfDecimals: primaryNumberOfDecimals,
|
|
} = useUserPreferencedCurrency(PRIMARY);
|
|
|
|
// We have two helper methods that take an object that can have either
|
|
// gasPrice OR the EIP-1559 fields on it, plus gasLimit. This object is
|
|
// conditionally set to the appropriate fields to compute the minimum
|
|
// and maximum cost of a transaction given the current estimates or selected
|
|
// gas fees.
|
|
let gasSettings = {
|
|
gasLimit: decimalToHex(gasLimit),
|
|
};
|
|
if (supportsEIP1559) {
|
|
gasSettings = {
|
|
...gasSettings,
|
|
maxFeePerGas: decGWEIToHexWEI(maxFeePerGas || gasPrice || '0'),
|
|
maxPriorityFeePerGas: decGWEIToHexWEI(
|
|
maxPriorityFeePerGas || maxFeePerGas || gasPrice || '0',
|
|
),
|
|
baseFeePerGas: decGWEIToHexWEI(gasFeeEstimates.estimatedBaseFee ?? '0'),
|
|
};
|
|
} else {
|
|
gasSettings = {
|
|
...gasSettings,
|
|
gasPrice:
|
|
gasEstimateType === GasEstimateTypes.none
|
|
? '0x0'
|
|
: decGWEIToHexWEI(gasPrice),
|
|
};
|
|
}
|
|
|
|
// The maximum amount this transaction will cost
|
|
const maximumCostInHexWei = getMaximumGasTotalInHexWei(gasSettings);
|
|
|
|
if (editGasMode === EditGasModes.swaps) {
|
|
gasSettings = { ...gasSettings, gasLimit: minimumGasLimit };
|
|
}
|
|
|
|
// The minimum amount this transaction will cost
|
|
const minimumCostInHexWei = getMinimumGasTotalInHexWei(gasSettings);
|
|
|
|
const [estimatedMinimumNative] = useCurrencyDisplay(minimumCostInHexWei, {
|
|
numberOfDecimals: primaryNumberOfDecimals,
|
|
currency: primaryCurrency,
|
|
});
|
|
|
|
return {
|
|
estimatedMinimumNative,
|
|
maximumCostInHexWei,
|
|
minimumCostInHexWei,
|
|
};
|
|
}
|