UNPKG

@atomiqlabs/chain-evm

Version:

EVM specific base implementation

68 lines (67 loc) 2.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CitreaFees = void 0; const EVMFees_1 = require("../../evm/chain/modules/EVMFees"); const Utils_1 = require("../../utils/Utils"); class CitreaFees extends EVMFees_1.EVMFees { constructor() { super(...arguments); this.logger = (0, Utils_1.getLogger)("CitreaFees: "); this._blockFeeCache = null; } /** * Gets evm fee rate * * @private * @returns {Promise<bigint>} L1 gas price denominated in Wei */ async __getFeeRate() { const res = await this.provider.send("eth_getBlockByNumber", ["latest", false]); const l1Fee = BigInt(res.l1FeeRate); const baseFee = BigInt(res.baseFeePerGas) * this.feeMultiplierPPM / 1000000n; this.logger.debug("__getFeeRate(): Base fee rate: " + baseFee.toString(10) + ", l1 fee rate: " + l1Fee.toString(10)); return { baseFee, l1Fee }; } /** * Gets the gas price with caching, format: <gas price in Wei>;<transaction version: v1/v3> * * @private */ async getFeeRate() { if (this._blockFeeCache == null || Date.now() - this._blockFeeCache.timestamp > this.MAX_FEE_AGE) { let obj = { timestamp: Date.now(), feeRate: null }; obj.feeRate = this.__getFeeRate().catch(e => { if (this._blockFeeCache === obj) this._blockFeeCache = null; throw e; }); this._blockFeeCache = obj; } let { baseFee, l1Fee } = await this._blockFeeCache.feeRate; if (baseFee > this.maxFeeRatePerGas) baseFee = this.maxFeeRatePerGas; const fee = baseFee.toString(10) + "," + this.priorityFee.toString(10) + "," + l1Fee.toString(10); this.logger.debug("getFeeRate(): calculated fee: " + fee); return fee; } /** * Calculates the total gas fee paid for a given gas limit and state diff size at a given fee rate * * @param gas * @param stateDiffSize * @param feeRate */ static getGasFee(gas, feeRate, stateDiffSize = 0) { if (feeRate == null) return 0n; const [maxFee, priorityFee, l1StateDiffFee] = feeRate.split(","); return (BigInt(gas) * BigInt(maxFee)) + (BigInt(stateDiffSize) * BigInt(l1StateDiffFee ?? 0n)); } } exports.CitreaFees = CitreaFees; CitreaFees.StateDiffSize = { APPROVE_DIFF_SIZE: 40, };