mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-29 23:58:06 +01:00
107 lines
4.0 KiB
JavaScript
107 lines
4.0 KiB
JavaScript
import { Numeric } from './Numeric';
|
|
|
|
/**
|
|
* Accepts an options bag containing gas fee parameters in hex format and
|
|
* returns a gasTotal parameter representing the maximum amount of wei the
|
|
* transaction will cost.
|
|
*
|
|
* @param {object} options - gas fee parameters object
|
|
* @param {string} [options.gasLimit] - the maximum amount of gas to allow this
|
|
* transaction to consume. Value is a hex string
|
|
* @param {string} [options.gasPrice] - The fee in wei to pay per gas used.
|
|
* gasPrice is only set on Legacy type transactions. Value is hex string
|
|
* @param {string} [options.maxFeePerGas] - The maximum fee in wei to pay per
|
|
* gas used. maxFeePerGas is introduced in EIP 1559 and represents the max
|
|
* total a user will pay per gas. Actual cost is determined by baseFeePerGas
|
|
* on the block + maxPriorityFeePerGas. Value is hex string
|
|
* @returns {string} The maximum total cost of transaction in hex wei string
|
|
*/
|
|
export function getMaximumGasTotalInHexWei({
|
|
gasLimit = '0x0',
|
|
gasPrice,
|
|
maxFeePerGas,
|
|
} = {}) {
|
|
if (maxFeePerGas) {
|
|
return new Numeric(gasLimit, 16)
|
|
.times(new Numeric(maxFeePerGas, 16))
|
|
.toPrefixedHexString();
|
|
}
|
|
if (!gasPrice) {
|
|
throw new Error(
|
|
'getMaximumGasTotalInHexWei requires gasPrice be provided to calculate legacy gas total',
|
|
);
|
|
}
|
|
|
|
return new Numeric(gasLimit, 16)
|
|
.times(new Numeric(gasPrice, 16))
|
|
.toPrefixedHexString();
|
|
}
|
|
|
|
/**
|
|
* Accepts an options bag containing gas fee parameters in hex format and
|
|
* returns a gasTotal parameter representing the minimum amount of wei the
|
|
* transaction will cost. For gasPrice types this is the same as max.
|
|
*
|
|
* @param {object} options - gas fee parameters object
|
|
* @param {string} [options.gasLimit] - the maximum amount of gas to allow this
|
|
* transaction to consume. Value is a hex string
|
|
* @param {string} [options.gasPrice] - The fee in wei to pay per gas used.
|
|
* gasPrice is only set on Legacy type transactions. Value is hex string
|
|
* @param {string} [options.maxFeePerGas] - The maximum fee in wei to pay per
|
|
* gas used. maxFeePerGas is introduced in EIP 1559 and represents the max
|
|
* total a user will pay per gas. Actual cost is determined by baseFeePerGas
|
|
* on the block + maxPriorityFeePerGas. Value is hex string
|
|
* @param {string} [options.maxPriorityFeePerGas] - The maximum fee in wei to
|
|
* pay a miner to include this transaction.
|
|
* @param {string} [options.baseFeePerGas] - The estimated block baseFeePerGas
|
|
* that will be burned. Introduced in EIP 1559. Value in hex wei.
|
|
* @returns {string} The minimum total cost of transaction in hex wei string
|
|
*/
|
|
export function getMinimumGasTotalInHexWei({
|
|
gasLimit = '0x0',
|
|
gasPrice,
|
|
maxPriorityFeePerGas,
|
|
maxFeePerGas,
|
|
baseFeePerGas,
|
|
} = {}) {
|
|
const isEIP1559Estimate = Boolean(
|
|
maxFeePerGas || maxPriorityFeePerGas || baseFeePerGas,
|
|
);
|
|
if (isEIP1559Estimate && gasPrice) {
|
|
throw new Error(
|
|
`getMinimumGasTotalInHexWei expects either gasPrice OR the EIP-1559 gas fields, but both were provided`,
|
|
);
|
|
}
|
|
|
|
if (isEIP1559Estimate === false && !gasPrice) {
|
|
throw new Error(
|
|
`getMinimumGasTotalInHexWei expects either gasPrice OR the EIP-1559 gas fields, but neither were provided`,
|
|
);
|
|
}
|
|
|
|
if (isEIP1559Estimate && !baseFeePerGas) {
|
|
throw new Error(
|
|
`getMinimumGasTotalInHexWei requires baseFeePerGas be provided when calculating EIP-1559 totals`,
|
|
);
|
|
}
|
|
|
|
if (isEIP1559Estimate && (!maxFeePerGas || !maxPriorityFeePerGas)) {
|
|
throw new Error(
|
|
`getMinimumGasTotalInHexWei requires maxFeePerGas and maxPriorityFeePerGas be provided when calculating EIP-1559 totals`,
|
|
);
|
|
}
|
|
if (isEIP1559Estimate === false) {
|
|
return getMaximumGasTotalInHexWei({ gasLimit, gasPrice });
|
|
}
|
|
const minimumFeePerGas = new Numeric(baseFeePerGas, 16)
|
|
.add(new Numeric(maxPriorityFeePerGas, 16))
|
|
.toString();
|
|
|
|
if (new Numeric(minimumFeePerGas, 16).greaterThan(maxFeePerGas, 16)) {
|
|
return getMaximumGasTotalInHexWei({ gasLimit, maxFeePerGas });
|
|
}
|
|
return new Numeric(gasLimit, 16)
|
|
.times(new Numeric(minimumFeePerGas, 16))
|
|
.toPrefixedHexString();
|
|
}
|