ethereum.forks.amsterdam.vm.gas

Ethereum Virtual Machine (EVM) Gas.

.. contents:: Table of Contents :backlinks: none :local:

Introduction

EVM gas constants and calculators.

GasCosts

Constant gas values for the EVM.

class GasCosts:

BASE

36
    BASE = Uint(2)

VERY_LOW

37
    VERY_LOW = Uint(3)

LOW

38
    LOW = Uint(5)

MID

39
    MID = Uint(8)

HIGH

40
    HIGH = Uint(10)

WARM_ACCESS

43
    WARM_ACCESS = Uint(100)

COLD_ACCOUNT_ACCESS

44
    COLD_ACCOUNT_ACCESS = Uint(2600)

COLD_STORAGE_ACCESS

45
    COLD_STORAGE_ACCESS = Uint(2100)

STORAGE_SET

48
    STORAGE_SET = Uint(20000)

COLD_STORAGE_WRITE

49
    COLD_STORAGE_WRITE = Uint(5000)

CALL_VALUE

52
    CALL_VALUE = Uint(9000)

CALL_STIPEND

53
    CALL_STIPEND = Uint(2300)

NEW_ACCOUNT

54
    NEW_ACCOUNT = Uint(25000)

CODE_DEPOSIT_PER_BYTE

57
    CODE_DEPOSIT_PER_BYTE = Uint(200)

CODE_INIT_PER_WORD

58
    CODE_INIT_PER_WORD = Uint(2)

AUTH_PER_EMPTY_ACCOUNT

61
    AUTH_PER_EMPTY_ACCOUNT = 25000

ZERO

64
    ZERO = Uint(0)

MEMORY_PER_WORD

65
    MEMORY_PER_WORD = Uint(3)

FAST_STEP

66
    FAST_STEP = Uint(5)

REFUND_STORAGE_CLEAR

69
    REFUND_STORAGE_CLEAR = 4800

PRECOMPILE_ECRECOVER

72
    PRECOMPILE_ECRECOVER = Uint(3000)

PRECOMPILE_P256VERIFY

73
    PRECOMPILE_P256VERIFY = Uint(6900)

PRECOMPILE_SHA256_BASE

74
    PRECOMPILE_SHA256_BASE = Uint(60)

PRECOMPILE_SHA256_PER_WORD

75
    PRECOMPILE_SHA256_PER_WORD = Uint(12)

PRECOMPILE_RIPEMD160_BASE

76
    PRECOMPILE_RIPEMD160_BASE = Uint(600)

PRECOMPILE_RIPEMD160_PER_WORD

77
    PRECOMPILE_RIPEMD160_PER_WORD = Uint(120)

PRECOMPILE_IDENTITY_BASE

78
    PRECOMPILE_IDENTITY_BASE = Uint(15)

PRECOMPILE_IDENTITY_PER_WORD

79
    PRECOMPILE_IDENTITY_PER_WORD = Uint(3)

PRECOMPILE_BLAKE2F_PER_ROUND

80
    PRECOMPILE_BLAKE2F_PER_ROUND = Uint(1)

PRECOMPILE_POINT_EVALUATION

81
    PRECOMPILE_POINT_EVALUATION = Uint(50000)

PRECOMPILE_BLS_G1ADD

82
    PRECOMPILE_BLS_G1ADD = Uint(375)

PRECOMPILE_BLS_G1MUL

83
    PRECOMPILE_BLS_G1MUL = Uint(12000)

PRECOMPILE_BLS_G1MAP

84
    PRECOMPILE_BLS_G1MAP = Uint(5500)

PRECOMPILE_BLS_G2ADD

85
    PRECOMPILE_BLS_G2ADD = Uint(600)

PRECOMPILE_BLS_G2MUL

86
    PRECOMPILE_BLS_G2MUL = Uint(22500)

PRECOMPILE_BLS_G2MAP

87
    PRECOMPILE_BLS_G2MAP = Uint(23800)

PRECOMPILE_ECADD

88
    PRECOMPILE_ECADD = Uint(150)

PRECOMPILE_ECMUL

89
    PRECOMPILE_ECMUL = Uint(6000)

PRECOMPILE_ECPAIRING_BASE

90
    PRECOMPILE_ECPAIRING_BASE = Uint(45000)

PRECOMPILE_ECPAIRING_PER_POINT

91
    PRECOMPILE_ECPAIRING_PER_POINT = Uint(34000)

PER_BLOB

94
    PER_BLOB = U64(2**17)

BLOB_SCHEDULE_TARGET

95
    BLOB_SCHEDULE_TARGET = U64(14)

BLOB_TARGET_GAS_PER_BLOCK

96
    BLOB_TARGET_GAS_PER_BLOCK = PER_BLOB * BLOB_SCHEDULE_TARGET

BLOB_BASE_COST

97
    BLOB_BASE_COST = Uint(2**13)

BLOB_SCHEDULE_MAX

98
    BLOB_SCHEDULE_MAX = U64(21)

BLOB_MIN_GASPRICE

99
    BLOB_MIN_GASPRICE = Uint(1)

BLOB_BASE_FEE_UPDATE_FRACTION

100
    BLOB_BASE_FEE_UPDATE_FRACTION = Uint(11684671)

BLOCK_ACCESS_LIST_ITEM

103
    BLOCK_ACCESS_LIST_ITEM = Uint(2000)

TX_BASE

106
    TX_BASE = Uint(21000)

TX_CREATE

107
    TX_CREATE = Uint(32000)

TX_DATA_TOKEN_STANDARD

108
    TX_DATA_TOKEN_STANDARD = Uint(4)

TX_DATA_TOKEN_FLOOR

109
    TX_DATA_TOKEN_FLOOR = Uint(10)

TX_ACCESS_LIST_ADDRESS

110
    TX_ACCESS_LIST_ADDRESS = Uint(2400)

TX_ACCESS_LIST_STORAGE_KEY

111
    TX_ACCESS_LIST_STORAGE_KEY = Uint(1900)

LIMIT_ADJUSTMENT_FACTOR

114
    LIMIT_ADJUSTMENT_FACTOR = Uint(1024)

LIMIT_MINIMUM

115
    LIMIT_MINIMUM = Uint(5000)

OPCODE_ADD

118
    OPCODE_ADD = VERY_LOW

OPCODE_SUB

119
    OPCODE_SUB = VERY_LOW

OPCODE_MUL

120
    OPCODE_MUL = LOW

OPCODE_DIV

121
    OPCODE_DIV = LOW

OPCODE_SDIV

122
    OPCODE_SDIV = LOW

OPCODE_MOD

123
    OPCODE_MOD = LOW

OPCODE_SMOD

124
    OPCODE_SMOD = LOW

OPCODE_ADDMOD

125
    OPCODE_ADDMOD = MID

OPCODE_MULMOD

126
    OPCODE_MULMOD = MID

OPCODE_SIGNEXTEND

127
    OPCODE_SIGNEXTEND = LOW

OPCODE_LT

128
    OPCODE_LT = VERY_LOW

OPCODE_GT

129
    OPCODE_GT = VERY_LOW

OPCODE_SLT

130
    OPCODE_SLT = VERY_LOW

OPCODE_SGT

131
    OPCODE_SGT = VERY_LOW

OPCODE_EQ

132
    OPCODE_EQ = VERY_LOW

OPCODE_ISZERO

133
    OPCODE_ISZERO = VERY_LOW

OPCODE_AND

134
    OPCODE_AND = VERY_LOW

OPCODE_OR

135
    OPCODE_OR = VERY_LOW

OPCODE_XOR

136
    OPCODE_XOR = VERY_LOW

OPCODE_NOT

137
    OPCODE_NOT = VERY_LOW

OPCODE_BYTE

138
    OPCODE_BYTE = VERY_LOW

OPCODE_SHL

139
    OPCODE_SHL = VERY_LOW

OPCODE_SHR

140
    OPCODE_SHR = VERY_LOW

OPCODE_SAR

141
    OPCODE_SAR = VERY_LOW

OPCODE_CLZ

142
    OPCODE_CLZ = LOW

OPCODE_JUMP

143
    OPCODE_JUMP = MID

OPCODE_JUMPI

144
    OPCODE_JUMPI = HIGH

OPCODE_JUMPDEST

145
    OPCODE_JUMPDEST = Uint(1)

OPCODE_CALLDATALOAD

146
    OPCODE_CALLDATALOAD = VERY_LOW

OPCODE_BLOCKHASH

147
    OPCODE_BLOCKHASH = Uint(20)

OPCODE_COINBASE

148
    OPCODE_COINBASE = BASE

OPCODE_POP

149
    OPCODE_POP = BASE

OPCODE_MSIZE

150
    OPCODE_MSIZE = BASE

OPCODE_PC

151
    OPCODE_PC = BASE

OPCODE_GAS

152
    OPCODE_GAS = BASE

OPCODE_ADDRESS

153
    OPCODE_ADDRESS = BASE

OPCODE_ORIGIN

154
    OPCODE_ORIGIN = BASE

OPCODE_CALLER

155
    OPCODE_CALLER = BASE

OPCODE_CALLVALUE

156
    OPCODE_CALLVALUE = BASE

OPCODE_CALLDATASIZE

157
    OPCODE_CALLDATASIZE = BASE

OPCODE_CODESIZE

158
    OPCODE_CODESIZE = BASE

OPCODE_GASPRICE

159
    OPCODE_GASPRICE = BASE

OPCODE_TIMESTAMP

160
    OPCODE_TIMESTAMP = BASE

OPCODE_NUMBER

161
    OPCODE_NUMBER = BASE

OPCODE_GASLIMIT

162
    OPCODE_GASLIMIT = BASE

OPCODE_PREVRANDAO

163
    OPCODE_PREVRANDAO = BASE

OPCODE_RETURNDATASIZE

164
    OPCODE_RETURNDATASIZE = BASE

OPCODE_CHAINID

165
    OPCODE_CHAINID = BASE

OPCODE_BASEFEE

166
    OPCODE_BASEFEE = BASE

OPCODE_BLOBBASEFEE

167
    OPCODE_BLOBBASEFEE = BASE

OPCODE_BLOBHASH

168
    OPCODE_BLOBHASH = Uint(3)

OPCODE_PUSH

169
    OPCODE_PUSH = VERY_LOW

OPCODE_PUSH0

170
    OPCODE_PUSH0 = BASE

OPCODE_DUP

171
    OPCODE_DUP = VERY_LOW

OPCODE_SWAP

172
    OPCODE_SWAP = VERY_LOW

OPCODE_RETURNDATACOPY_BASE

175
    OPCODE_RETURNDATACOPY_BASE = VERY_LOW

OPCODE_RETURNDATACOPY_PER_WORD

176
    OPCODE_RETURNDATACOPY_PER_WORD = Uint(3)

OPCODE_CALLDATACOPY_BASE

177
    OPCODE_CALLDATACOPY_BASE = VERY_LOW

OPCODE_CODECOPY_BASE

178
    OPCODE_CODECOPY_BASE = VERY_LOW

OPCODE_MCOPY_BASE

179
    OPCODE_MCOPY_BASE = VERY_LOW

OPCODE_MLOAD_BASE

180
    OPCODE_MLOAD_BASE = VERY_LOW

OPCODE_MSTORE_BASE

181
    OPCODE_MSTORE_BASE = VERY_LOW

OPCODE_MSTORE8_BASE

182
    OPCODE_MSTORE8_BASE = VERY_LOW

OPCODE_COPY_PER_WORD

183
    OPCODE_COPY_PER_WORD = Uint(3)

OPCODE_CREATE_BASE

184
    OPCODE_CREATE_BASE = Uint(32000)

OPCODE_EXP_BASE

185
    OPCODE_EXP_BASE = Uint(10)

OPCODE_EXP_PER_BYTE

186
    OPCODE_EXP_PER_BYTE = Uint(50)

OPCODE_KECCAK256_BASE

187
    OPCODE_KECCAK256_BASE = Uint(30)

OPCODE_KECCACK256_PER_WORD

188
    OPCODE_KECCACK256_PER_WORD = Uint(6)

OPCODE_LOG_BASE

189
    OPCODE_LOG_BASE = Uint(375)

OPCODE_LOG_DATA_PER_BYTE

190
    OPCODE_LOG_DATA_PER_BYTE = Uint(8)

OPCODE_LOG_TOPIC

191
    OPCODE_LOG_TOPIC = Uint(375)

OPCODE_SELFDESTRUCT_BASE

192
    OPCODE_SELFDESTRUCT_BASE = Uint(5000)

OPCODE_SELFDESTRUCT_NEW_ACCOUNT

193
    OPCODE_SELFDESTRUCT_NEW_ACCOUNT = Uint(25000)

ExtendMemory

Define the parameters for memory extension in opcodes.

cost: ethereum.base_types.Uint The gas required to perform the extension expand_by: ethereum.base_types.Uint The size by which the memory will be extended

196
@dataclass
class ExtendMemory:

cost

207
    cost: Uint

expand_by

208
    expand_by: Uint

MessageCallGas

Define the gas cost and gas given to the sub-call for executing the call opcodes.

cost: ethereum.base_types.Uint The gas required to execute the call opcode, excludes memory expansion costs. sub_call: ethereum.base_types.Uint The portion of gas available to sub-calls that is refundable if not consumed.

211
@dataclass
class MessageCallGas:

cost

225
    cost: Uint

sub_call

226
    sub_call: Uint

check_gas

Checks if amount gas is available without charging it. Raises OutOfGasError if insufficient gas.

Parameters

evm : The current EVM. amount : The amount of gas to check.

def check_gas(evm: Evm, ​​amount: Uint) -> None:
230
    """
231
    Checks if `amount` gas is available without charging it.
232
    Raises OutOfGasError if insufficient gas.
233
234
    Parameters
235
    ----------
236
    evm :
237
        The current EVM.
238
    amount :
239
        The amount of gas to check.
240
241
    """
242
    if evm.gas_left < amount:
243
        raise OutOfGasError

charge_gas

Subtracts amount from evm.gas_left.

Parameters

evm : The current EVM. amount : The amount of gas the current operation requires.

def charge_gas(evm: Evm, ​​amount: Uint) -> None:
247
    """
248
    Subtracts `amount` from `evm.gas_left`.
249
250
    Parameters
251
    ----------
252
    evm :
253
        The current EVM.
254
    amount :
255
        The amount of gas the current operation requires.
256
257
    """
258
    evm_trace(evm, GasAndRefund(int(amount)))
259
260
    if evm.gas_left < amount:
261
        raise OutOfGasError
262
    else:
263
        evm.gas_left -= amount

calculate_memory_gas_cost

Calculates the gas cost for allocating memory to the smallest multiple of 32 bytes, such that the allocated size is at least as big as the given size.

Parameters

size_in_bytes : The size of the data in bytes.

Returns

total_gas_cost : ethereum.base_types.Uint The gas cost for storing data in memory.

def calculate_memory_gas_cost(size_in_bytes: Uint) -> Uint:
267
    """
268
    Calculates the gas cost for allocating memory
269
    to the smallest multiple of 32 bytes,
270
    such that the allocated size is at least as big as the given size.
271
272
    Parameters
273
    ----------
274
    size_in_bytes :
275
        The size of the data in bytes.
276
277
    Returns
278
    -------
279
    total_gas_cost : `ethereum.base_types.Uint`
280
        The gas cost for storing data in memory.
281
282
    """
283
    size_in_words = ceil32(size_in_bytes) // Uint(32)
284
    linear_cost = size_in_words * GasCosts.MEMORY_PER_WORD
285
    quadratic_cost = size_in_words ** Uint(2) // Uint(512)
286
    total_gas_cost = linear_cost + quadratic_cost
287
    try:
288
        return total_gas_cost
289
    except ValueError as e:
290
        raise OutOfGasError from e

calculate_gas_extend_memory

Calculates the gas amount to extend memory.

Parameters

memory : Memory contents of the EVM. extensions: List of extensions to be made to the memory. Consists of a tuple of start position and size.

Returns

extend_memory: ExtendMemory

def calculate_gas_extend_memory(memory: bytearray, ​​extensions: List[Tuple[U256, U256]]) -> ExtendMemory:
296
    """
297
    Calculates the gas amount to extend memory.
298
299
    Parameters
300
    ----------
301
    memory :
302
        Memory contents of the EVM.
303
    extensions:
304
        List of extensions to be made to the memory.
305
        Consists of a tuple of start position and size.
306
307
    Returns
308
    -------
309
    extend_memory: `ExtendMemory`
310
311
    """
312
    size_to_extend = Uint(0)
313
    to_be_paid = Uint(0)
314
    current_size = ulen(memory)
315
    for start_position, size in extensions:
316
        if size == 0:
317
            continue
318
        before_size = ceil32(current_size)
319
        after_size = ceil32(Uint(start_position) + Uint(size))
320
        if after_size <= before_size:
321
            continue
322
323
        size_to_extend += after_size - before_size
324
        already_paid = calculate_memory_gas_cost(before_size)
325
        total_cost = calculate_memory_gas_cost(after_size)
326
        to_be_paid += total_cost - already_paid
327
328
        current_size = after_size
329
330
    return ExtendMemory(to_be_paid, size_to_extend)

calculate_message_call_gas

Calculates the MessageCallGas (cost and gas made available to the sub-call) for executing call Opcodes.

Parameters

value: The amount of ETH that needs to be transferred. gas : The amount of gas provided to the message-call. gas_left : The amount of gas left in the current frame. memory_cost : The amount needed to extend the memory in the current frame. extra_gas : The amount of gas needed for transferring value + creating a new account inside a message call. call_stipend : The amount of stipend provided to a message call to execute code while transferring value (ETH).

Returns

message_call_gas: MessageCallGas

def calculate_message_call_gas(value: U256, ​​gas: Uint, ​​gas_left: Uint, ​​memory_cost: Uint, ​​extra_gas: Uint, ​​call_stipend: Uint) -> MessageCallGas:
341
    """
342
    Calculates the MessageCallGas (cost and gas made available to the sub-call)
343
    for executing call Opcodes.
344
345
    Parameters
346
    ----------
347
    value:
348
        The amount of `ETH` that needs to be transferred.
349
    gas :
350
        The amount of gas provided to the message-call.
351
    gas_left :
352
        The amount of gas left in the current frame.
353
    memory_cost :
354
        The amount needed to extend the memory in the current frame.
355
    extra_gas :
356
        The amount of gas needed for transferring value + creating a new
357
        account inside a message call.
358
    call_stipend :
359
        The amount of stipend provided to a message call to execute code while
360
        transferring value (ETH).
361
362
    Returns
363
    -------
364
    message_call_gas: `MessageCallGas`
365
366
    """
367
    call_stipend = Uint(0) if value == 0 else call_stipend
368
    if gas_left < extra_gas + memory_cost:
369
        return MessageCallGas(gas + extra_gas, gas + call_stipend)
370
371
    gas = min(gas, max_message_call_gas(gas_left - memory_cost - extra_gas))
372
373
    return MessageCallGas(gas + extra_gas, gas + call_stipend)

max_message_call_gas

Calculates the maximum gas that is allowed for making a message call.

Parameters

gas : The amount of gas provided to the message-call.

Returns

max_allowed_message_call_gas: ethereum.base_types.Uint The maximum gas allowed for making the message-call.

def max_message_call_gas(gas: Uint) -> Uint:
377
    """
378
    Calculates the maximum gas that is allowed for making a message call.
379
380
    Parameters
381
    ----------
382
    gas :
383
        The amount of gas provided to the message-call.
384
385
    Returns
386
    -------
387
    max_allowed_message_call_gas: `ethereum.base_types.Uint`
388
        The maximum gas allowed for making the message-call.
389
390
    """
391
    return gas - (gas // Uint(64))

init_code_cost

Calculates the gas to be charged for the init code in CREATE* opcodes as well as create transactions.

Parameters

init_code_length : The length of the init code provided to the opcode or a create transaction

Returns

init_code_gas: ethereum.base_types.Uint The gas to be charged for the init code.

def init_code_cost(init_code_length: Uint) -> Uint:
395
    """
396
    Calculates the gas to be charged for the init code in CREATE*
397
    opcodes as well as create transactions.
398
399
    Parameters
400
    ----------
401
    init_code_length :
402
        The length of the init code provided to the opcode
403
        or a create transaction
404
405
    Returns
406
    -------
407
    init_code_gas: `ethereum.base_types.Uint`
408
        The gas to be charged for the init code.
409
410
    """
411
    return GasCosts.CODE_INIT_PER_WORD * ceil32(init_code_length) // Uint(32)

calculate_excess_blob_gas

Calculates the excess blob gas for the current block based on the gas used in the parent block.

Parameters

parent_header : The parent block of the current block.

Returns

excess_blob_gas: ethereum.base_types.U64 The excess blob gas for the current block.

def calculate_excess_blob_gas(parent_header: Header | PreviousHeader) -> U64:
417
    """
418
    Calculates the excess blob gas for the current block based
419
    on the gas used in the parent block.
420
421
    Parameters
422
    ----------
423
    parent_header :
424
        The parent block of the current block.
425
426
    Returns
427
    -------
428
    excess_blob_gas: `ethereum.base_types.U64`
429
        The excess blob gas for the current block.
430
431
    """
432
    # At the fork block, these are defined as zero.
433
    excess_blob_gas = U64(0)
434
    blob_gas_used = U64(0)
435
    base_fee_per_gas = Uint(0)
436
437
    if isinstance(parent_header, Header):
438
        # After the fork block, read them from the parent header.
439
        excess_blob_gas = parent_header.excess_blob_gas
440
        blob_gas_used = parent_header.blob_gas_used
441
        base_fee_per_gas = parent_header.base_fee_per_gas
442
443
    parent_blob_gas = excess_blob_gas + blob_gas_used
444
    if parent_blob_gas < GasCosts.BLOB_TARGET_GAS_PER_BLOCK:
445
        return U64(0)
446
447
    target_blob_gas_price = Uint(GasCosts.PER_BLOB)
448
    target_blob_gas_price *= calculate_blob_gas_price(excess_blob_gas)
449
450
    base_blob_tx_price = GasCosts.BLOB_BASE_COST * base_fee_per_gas
451
    if base_blob_tx_price > target_blob_gas_price:
452
        blob_schedule_delta = (
453
            GasCosts.BLOB_SCHEDULE_MAX - GasCosts.BLOB_SCHEDULE_TARGET
454
        )
455
        return (
456
            excess_blob_gas
457
            + blob_gas_used * blob_schedule_delta // GasCosts.BLOB_SCHEDULE_MAX
458
        )
459
460
    return parent_blob_gas - GasCosts.BLOB_TARGET_GAS_PER_BLOCK

calculate_total_blob_gas

Calculate the total blob gas for a transaction.

Parameters

tx : The transaction for which the blob gas is to be calculated.

Returns

total_blob_gas: ethereum.base_types.Uint The total blob gas for the transaction.

def calculate_total_blob_gas(tx: Transaction) -> U64:
464
    """
465
    Calculate the total blob gas for a transaction.
466
467
    Parameters
468
    ----------
469
    tx :
470
        The transaction for which the blob gas is to be calculated.
471
472
    Returns
473
    -------
474
    total_blob_gas: `ethereum.base_types.Uint`
475
        The total blob gas for the transaction.
476
477
    """
478
    if isinstance(tx, BlobTransaction):
479
        return GasCosts.PER_BLOB * U64(len(tx.blob_versioned_hashes))
480
    else:
481
        return U64(0)

calculate_blob_gas_price

Calculate the blob gasprice for a block.

Parameters

excess_blob_gas : The excess blob gas for the block.

Returns

blob_gasprice: Uint The blob gasprice.

def calculate_blob_gas_price(excess_blob_gas: U64) -> Uint:
485
    """
486
    Calculate the blob gasprice for a block.
487
488
    Parameters
489
    ----------
490
    excess_blob_gas :
491
        The excess blob gas for the block.
492
493
    Returns
494
    -------
495
    blob_gasprice: `Uint`
496
        The blob gasprice.
497
498
    """
499
    return taylor_exponential(
500
        GasCosts.BLOB_MIN_GASPRICE,
501
        Uint(excess_blob_gas),
502
        GasCosts.BLOB_BASE_FEE_UPDATE_FRACTION,
503
    )

calculate_data_fee

Calculate the blob data fee for a transaction.

Parameters

excess_blob_gas : The excess_blob_gas for the execution. tx : The transaction for which the blob data fee is to be calculated.

Returns

data_fee: Uint The blob data fee.

def calculate_data_fee(excess_blob_gas: U64, ​​tx: Transaction) -> Uint:
507
    """
508
    Calculate the blob data fee for a transaction.
509
510
    Parameters
511
    ----------
512
    excess_blob_gas :
513
        The excess_blob_gas for the execution.
514
    tx :
515
        The transaction for which the blob data fee is to be calculated.
516
517
    Returns
518
    -------
519
    data_fee: `Uint`
520
        The blob data fee.
521
522
    """
523
    return Uint(calculate_total_blob_gas(tx)) * calculate_blob_gas_price(
524
        excess_blob_gas
525
    )