@vechain.energy/gas
Version:
calculate estimated gas usage for transactions
50 lines (39 loc) • 1.41 kB
text/typescript
import intrinsic from "./intrinsic";
import vmPrice from "./vmPrice";
import feeMarket, { FeeMarketOptions } from "./feeMarket";
type Options = {
nodeOrConnex?: Connex | string
caller?: string
gasPriceCoef?: number
// Fee market options
maxFeePerGas?: string | number
maxPriorityFeePerGas?: string | number
}
const defaultOptions = {
nodeOrConnex: "https://mainnet.veblocks.net",
gasPriceCoef: 0
}
export default async function estimate(clauses: Connex.VM.Clause[], _options: Options = {}): Promise<number> {
const options = {
...defaultOptions,
..._options
}
const intrinsicGas = intrinsic(clauses)
const vmGas = await vmPrice(clauses, options.nodeOrConnex, options.caller)
const transactionGas = intrinsicGas + vmGas
// Always use dynamic fee market (post-Galactica fork)
const feeMarketOptions: FeeMarketOptions = {}
if (options.maxFeePerGas !== undefined) {
feeMarketOptions.maxFeePerGas = options.maxFeePerGas
}
if (options.maxPriorityFeePerGas !== undefined) {
feeMarketOptions.maxPriorityFeePerGas = options.maxPriorityFeePerGas
}
const feePerGas = await feeMarket(options.nodeOrConnex, feeMarketOptions)
// Calculate final gas cost
const gasCost = feePerGas
.times(transactionGas)
.dividedBy(1e13)
.decimalPlaces(0)
return gasCost.toNumber()
}