|
|
|
import { addHexPrefix } from 'ethereumjs-util';
|
|
|
|
import {
|
|
|
|
addCurrencies,
|
|
|
|
conversionGreaterThan,
|
|
|
|
multiplyCurrencies,
|
|
|
|
} from './conversion.utils';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 addHexPrefix(
|
|
|
|
multiplyCurrencies(gasLimit, maxFeePerGas, {
|
|
|
|
toNumericBase: 'hex',
|
|
|
|
multiplicandBase: 16,
|
|
|
|
multiplierBase: 16,
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (!gasPrice) {
|
|
|
|
throw new Error(
|
|
|
|
'getMaximumGasTotalInHexWei requires gasPrice be provided to calculate legacy gas total',
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return addHexPrefix(
|
|
|
|
multiplyCurrencies(gasLimit, gasPrice, {
|
|
|
|
toNumericBase: 'hex',
|
|
|
|
multiplicandBase: 16,
|
|
|
|
multiplierBase: 16,
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 = addCurrencies(baseFeePerGas, maxPriorityFeePerGas, {
|
|
|
|
toNumericBase: 'hex',
|
|
|
|
aBase: 16,
|
|
|
|
bBase: 16,
|
|
|
|
});
|
|
|
|
|
|
|
|
if (
|
|
|
|
conversionGreaterThan(
|
|
|
|
{ value: minimumFeePerGas, fromNumericBase: 'hex' },
|
|
|
|
{ value: maxFeePerGas, fromNumericBase: 'hex' },
|
|
|
|
)
|
|
|
|
) {
|
|
|
|
return getMaximumGasTotalInHexWei({ gasLimit, maxFeePerGas });
|
|
|
|
}
|
|
|
|
return addHexPrefix(
|
|
|
|
multiplyCurrencies(gasLimit, minimumFeePerGas, {
|
|
|
|
toNumericBase: 'hex',
|
|
|
|
multiplicandBase: 16,
|
|
|
|
multiplierBase: 16,
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
}
|