import React, { useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { HIGH_FEE_WARNING_MULTIPLIER } from '../../../../../pages/send/send.constants'; import { EDIT_GAS_MODES, PRIORITY_LEVELS, } from '../../../../../../shared/constants/gas'; import { PRIMARY } from '../../../../../helpers/constants/common'; import { decGWEIToHexWEI } from '../../../../../helpers/utils/conversions.util'; import { getAdvancedGasFeeValues } from '../../../../../selectors'; import { useCurrencyDisplay } from '../../../../../hooks/useCurrencyDisplay'; import { useGasFeeContext } from '../../../../../contexts/gasFee'; import { useI18nContext } from '../../../../../hooks/useI18nContext'; import { useUserPreferencedCurrency } from '../../../../../hooks/useUserPreferencedCurrency'; import FormField from '../../../../ui/form-field'; import Box from '../../../../ui/box'; import { bnGreaterThan, bnLessThan } from '../../../../../helpers/utils/util'; import { useAdvancedGasFeePopoverContext } from '../../context'; import AdvancedGasFeeInputSubtext from '../../advanced-gas-fee-input-subtext'; const validatePriorityFee = (value, gasFeeEstimates) => { if (value <= 0) { return 'editGasMaxPriorityFeeBelowMinimumV2'; } if ( gasFeeEstimates?.low && bnLessThan(value, gasFeeEstimates.low.suggestedMaxPriorityFeePerGas) ) { return 'editGasMaxPriorityFeeLowV2'; } if ( gasFeeEstimates?.high && bnGreaterThan( value, gasFeeEstimates.high.suggestedMaxPriorityFeePerGas * HIGH_FEE_WARNING_MULTIPLIER, ) ) { return 'editGasMaxPriorityFeeHighV2'; } return null; }; const PriorityFeeInput = () => { const t = useI18nContext(); const advancedGasFeeValues = useSelector(getAdvancedGasFeeValues); const { gasLimit, setErrorValue, setMaxPriorityFeePerGas } = useAdvancedGasFeePopoverContext(); const { editGasMode, estimateUsed, gasFeeEstimates, maxPriorityFeePerGas } = useGasFeeContext(); const { latestPriorityFeeRange, historicalPriorityFeeRange, priorityFeeTrend, } = gasFeeEstimates; const [priorityFeeError, setPriorityFeeError] = useState(); const [priorityFee, setPriorityFee] = useState(() => { if ( estimateUsed !== PRIORITY_LEVELS.CUSTOM && advancedGasFeeValues?.priorityFee && editGasMode !== EDIT_GAS_MODES.SWAPS ) { return advancedGasFeeValues.priorityFee; } return maxPriorityFeePerGas; }); const { currency, numberOfDecimals } = useUserPreferencedCurrency(PRIMARY); const [priorityFeeInPrimaryCurrency] = useCurrencyDisplay( decGWEIToHexWEI(priorityFee * gasLimit), { currency, numberOfDecimals }, ); const updatePriorityFee = (value) => { setPriorityFee(value); }; useEffect(() => { setMaxPriorityFeePerGas(priorityFee); const error = validatePriorityFee(priorityFee, gasFeeEstimates); setErrorValue( 'maxPriorityFeePerGas', error === 'editGasMaxPriorityFeeBelowMinimumV2', ); setPriorityFeeError(error); }, [ gasFeeEstimates, priorityFee, setErrorValue, setMaxPriorityFeePerGas, setPriorityFeeError, ]); return ( ); }; export default PriorityFeeInput;