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.
Tag:
Branch:
Tree:
19ec45ef35
develop
feature/default_network_editable
v10.22.3
${ noResults }
102 lines
3.2 KiB
102 lines
3.2 KiB
import { useDispatch, useSelector } from 'react-redux';
|
|||
import { useCallback } from 'react';
|
|||
import { addHexPrefix } from 'ethereumjs-util';
|
|||
import { showModal, showSidebar } from '../store/actions';
|
|||
import { isBalanceSufficient } from '../pages/send/send.utils';
|
|||
|
import {
|
||
getHexGasTotal,
|
|||
increaseLastGasPrice,
|
|||
} from '../helpers/utils/confirm-tx.util';
|
|||
import { getConversionRate, getSelectedAccount } from '../selectors';
|
|||
import {
|
|||
setCustomGasLimit,
|
|||
setCustomGasPriceForRetry,
|
|||
} from '../ducks/gas/gas.duck';
|
|||
import { multiplyCurrencies } from '../helpers/utils/conversion-util';
|
|||
|
|||
/**
|
|||
* Determine whether a transaction can be cancelled and provide a method to
|
|||
* kick off the process of cancellation.
|
|||
*
|
|||
* Provides a reusable hook that, given a transactionGroup, will return
|
|||
* whether or not the account has enough funds to cover the gas cancellation
|
|||
* fee, and a method for beginning the cancellation process
|
|||
* @param {Object} transactionGroup
|
|||
* @return {[boolean, Function]}
|
|||
*/
|
|||
|
export function useCancelTransaction(transactionGroup) {
|
||
const { primaryTransaction } = transactionGroup;
|
|||
|
|||
const transactionGasPrice = primaryTransaction.txParams?.gasPrice;
|
|||
const gasPrice =
|
|||
transactionGasPrice === undefined || transactionGasPrice?.startsWith('-')
|
|||
? '0x0'
|
|||
: primaryTransaction.txParams?.gasPrice;
|
|||
const transaction = primaryTransaction;
|
|||
const dispatch = useDispatch();
|
|||
const selectedAccount = useSelector(getSelectedAccount);
|
|||
const conversionRate = useSelector(getConversionRate);
|
|||
const defaultNewGasPrice = addHexPrefix(
|
|||
multiplyCurrencies(gasPrice, 1.1, {
|
|||
toNumericBase: 'hex',
|
|||
multiplicandBase: 16,
|
|||
multiplierBase: 10,
|
|||
}),
|
|||
);
|
|||
|
|||
|
const cancelTransaction = useCallback(
|
||
(event) => {
|
|||
event.stopPropagation();
|
|||
dispatch(setCustomGasLimit('0x5208'));
|
|||
dispatch(setCustomGasPriceForRetry(defaultNewGasPrice));
|
|||
const tx = {
|
|||
...transaction,
|
|||
txParams: {
|
|||
...transaction.txParams,
|
|||
gas: '0x5208',
|
|||
value: '0x0',
|
|||
},
|
|||
};
|
|||
|
return dispatch(
|
||
showSidebar({
|
|||
transitionName: 'sidebar-left',
|
|||
type: 'customize-gas',
|
|||
props: {
|
|||
transaction: tx,
|
|||
onSubmit: (newGasLimit, newGasPrice) => {
|
|||
const userCustomizedGasTotal = getHexGasTotal({
|
|||
gasPrice: newGasPrice,
|
|||
gasLimit: newGasLimit,
|
|||
});
|
|||
dispatch(
|
|||
showModal({
|
|||
name: 'CANCEL_TRANSACTION',
|
|||
newGasFee: userCustomizedGasTotal,
|
|||
transactionId: transaction.id,
|
|||
defaultNewGasPrice: newGasPrice,
|
|||
gasLimit: newGasLimit,
|
|||
}),
|
|||
);
|
|||
},
|
|||
},
|
|||
|
}),
|
||
);
|
|||
|
},
|
||
[dispatch, transaction, defaultNewGasPrice],
|
|||
);
|
|||
|
|||
|
const hasEnoughCancelGas =
|
||
primaryTransaction.txParams &&
|
|||
isBalanceSufficient({
|
|||
amount: '0x0',
|
|||
gasTotal: getHexGasTotal({
|
|||
gasPrice: increaseLastGasPrice(gasPrice),
|
|||
gasLimit: primaryTransaction.txParams.gas,
|
|||
}),
|
|||
balance: selectedAccount.balance,
|
|||
conversionRate,
|
|||
});
|
|||
|
|||
return [hasEnoughCancelGas, cancelTransaction];
|
|||
}
|