<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ethereum EIPs</title>
    <description>All EIPs that are not ERCs</description>
    <link>https://eips.ethereum.org</link>
    <atom:link href="https://eips.ethereum.org/rss/last-call.xml" rel="self" type="application/rss+xml" />
    <lastBuildDate>Sat, 10 Oct 2026 23:22:42 +0000</lastBuildDate>
    
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
      <item>
        <title>Resource-based intrinsic transaction gas</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #2780 - Resource-based intrinsic transaction gas&lt;/strong&gt; is in Last Call status. It is authored by Matt Garnett (@lightclient), Uri Klarman (@uriklarman), Ben Adams (@benaadams), Maria Inês Silva (@misilva73), Anders Elowsson (@anderselowsson), Anthony Sassano (@sassal), Dragan Rakita (@rakita) and was originally created 2020-07-11. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-2780-reduce-intrinsic-cost-of-transactions/4413&quot;&gt;https://ethereum-magicians.org/t/eip-2780-reduce-intrinsic-cost-of-transactions/4413&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP decomposes the flat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; intrinsic transaction cost into explicit primitives, each priced to match the resources a transaction actually consumes. A plain ETH transfer to an existing account remains at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; execution gas, and contract-creation transactions cost the same whether or not they carry value. Transactions that create new accounts or interact with &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; pay the additional runtime costs they incur.&lt;/p&gt;

&lt;p&gt;In addition, the new primitives are split into intrinsic gas and runtime gas. &lt;strong&gt;Intrinsic gas&lt;/strong&gt; is the state-independent cost of including the transaction in a block and is the sole input to the transaction-validity check. &lt;strong&gt;Runtime gas&lt;/strong&gt; covers the state-dependent charges, such as new account creation and delegation resolution. Runtime gas is charged before the first frame is entered and is metered in the same way as gas inside the frame. Running out of runtime gas does not invalidate the transaction. Instead, the transaction is included, execution is skipped, and the pre-execution state changes are reverted.&lt;/p&gt;

&lt;p&gt;This EIP does not change calldata or access-list metering.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;The flat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; intrinsic cost charges every transaction the same amount regardless of what it does. A zero-value transaction to an existing account and a value transfer that creates a new account both pay &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt;, even though the latter touches an extra account, writes an extra balance, emits a log, and permanently grows the state. The single constant both over-prices the simplest paths and under-prices the ones that consume real, lasting resources.&lt;/p&gt;

&lt;p&gt;This EIP replaces the constant with a decomposition into named primitives, each priced to the resource it represents. The goal is to make every transaction’s cost reflect its actual work:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Accuracy.&lt;/strong&gt; Signature recovery, account accesses, account writes, value transfers, and state creation are billed separately, so cost tracks usage.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;State growth is internalized.&lt;/strong&gt; A value transfer that creates an account, like a contract-creation transaction, pays &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; in state gas. This aligns top-level value transfers with internal &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt;-based account creation, which already pays for the new leaf, and prices the durable state cost the flat base ignored.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Composability.&lt;/strong&gt; Pricing intrinsic cost as a sum of the same primitives used elsewhere in the gas schedule lets future repricings (e.g. of cold-account access in &lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;, or of state bytes in &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;) flow through automatically, without re-deriving a bespoke constant.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No worst-case reservation.&lt;/strong&gt; State-dependent costs, such as new account creation and delegation resolution, are charged at runtime only when a transaction incurs them, rather than reserved up front. Intrinsic gas covers only inclusion and remains the sole validity input, so a transaction that funds inclusion but not a runtime charge is included, charged for the gas consumed, and reverted, exactly like an out-of-gas halt inside a call frame.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;parameters&quot;&gt;Parameters&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Name&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Value&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Definition&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;12,000&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Sender cost: ECDSA recovery, the sender’s account access, the sender’s account write and inclusion in block&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;6,000&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Recipient balance write and &lt;a href=&quot;/EIPS/eip-7708&quot;&gt;EIP-7708&lt;/a&gt; transfer log performed by a value transfer&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The remaining values are defined in other EIPs and referenced here:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Name&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Value&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Source&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Definition&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3,000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Cold account touch&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;100&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Warm account touch&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;9,000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;First write to an account leaf&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;12,000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Contract-deployment account access and write&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;7,816&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Per-authorization base: calldata, ECDSA recovery, cold authority access, and warm writes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;183,600&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;State gas for one new account leaf&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_AUTH_BASE × CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;35,190&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;State gas for one 23-byte delegation indicator&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The two state-gas products change whenever &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; changes. Execution-gas and state-gas semantics are defined by &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;intrinsic-gas-costs&quot;&gt;Intrinsic gas costs&lt;/h3&gt;

&lt;p&gt;A transaction’s intrinsic base cost is decomposed into the following explicit primitives:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.sender&lt;/code&gt; is charged &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; in execution gas, accounting for one ECDSA recovery, the sender’s account access and write, and the inclusion of the transaction’s bytes in the block.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.to&lt;/code&gt; is charged based on its type:
    &lt;ul&gt;
      &lt;li&gt;if self-transfer (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.sender == tx.to&lt;/code&gt;), there are no charges;&lt;/li&gt;
      &lt;li&gt;if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt; (contract-creation transaction), charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt; in execution gas; the new-account state charge depends on whether the deployment target exists and is charged at runtime;&lt;/li&gt;
      &lt;li&gt;otherwise, charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; in execution gas (covering the recipient touch, charged at the cold rate unconditionally).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.value&lt;/code&gt; is charged based on its value:
    &lt;ul&gt;
      &lt;li&gt;if zero, there are no charges;&lt;/li&gt;
      &lt;li&gt;if non-zero and self-transfer, there are no charges;&lt;/li&gt;
      &lt;li&gt;if non-zero and contract creation, there are no charges; the recipient balance write is already covered by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt;;&lt;/li&gt;
      &lt;li&gt;otherwise, charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt; in execution gas.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;each &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorization is charged &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt; in execution gas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The recipient touch and the authority access (inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt;) are charged at the cold rate every time, even if the account would be warm (for example, via an access list), keeping intrinsic gas computable without any state read.&lt;/p&gt;

&lt;p&gt;These charges replace the legacy contract-creation transaction charges and EIP-7702’s flat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PER_EMPTY_ACCOUNT_COST × authorization_list_length&lt;/code&gt; intrinsic charge.&lt;/p&gt;

&lt;p&gt;Calldata and access-list metering remain unchanged.&lt;/p&gt;

&lt;h3 id=&quot;runtime-gas-costs&quot;&gt;Runtime gas costs&lt;/h3&gt;

&lt;p&gt;Once the transaction passes the intrinsic gas check, the state-dependent gas costs (i.e., runtime costs) are applied. The runtime charges happen in a distinct window — the pre-execution phase — after the transaction is already deemed valid but before the first EVM frame is entered. This phase includes the following actions, in order:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The available gas is split into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt;, and all the gas accounting counters are initialized, per &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorizations are processed;&lt;/li&gt;
  &lt;li&gt;The recipient account is added to the &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;’s Block-Level Access List (its access was already charged at the cold rate at the intrinsic phase, and it is warm from transaction start);&lt;/li&gt;
  &lt;li&gt;The remaining account creation and access costs are applied.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Like every charge in this EIP, each runtime charge is split into execution gas and state gas per &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;: account accesses and writes are execution gas, while durable state growth (new account leaves and net-new delegation bytes) is state gas. This mirrors how a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; frame is metered: accesses, account creation, and writes are charged as state is touched, not up front.&lt;/p&gt;

&lt;p&gt;Running out of gas during these runtime charges does &lt;strong&gt;not&lt;/strong&gt; invalidate the transaction. Validity is decided solely by the intrinsic gas check.&lt;/p&gt;

&lt;p&gt;If the transaction goes out-of-gas in this pre-execution phase, the sender pays for all gas consumed, and all pre-execution state changes are reverted, including any &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; delegations. The included transaction still increments the sender’s nonce and pays its gas fees. By contrast, if the transaction goes out-of-gas after entering the first EVM frame, the delegations applied during the pre-execution phase stay in place, per &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt;; the state gas that paid for them — each authority’s account-creation and delegation-indicator bytes — therefore stays consumed, since that state persists beyond the frame. Runtime state charges whose state is instead rolled back with the frame (for example, a contract-creation transaction’s new-account charge; see below) are refilled in LIFO order per &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;, and execution-gas runtime charges (such as a delegation-target access) remain consumed.&lt;/p&gt;

&lt;p&gt;If a contract-creation transaction’s initcode reverts, the transaction remains valid and any state gas charged at runtime is refilled in last-in, first-out (LIFO) order, per &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;: the portion the charge drew from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; is credited back to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;, and only the remainder returns to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On an exceptional halt, the same LIFO refill applies. A plain value transfer to a new account executes no code and so cannot revert. Its new-account state charge is therefore never rolled back this way. The exception is a transfer to an empty precompile, which does execute and can fail, though on mainnet all precompiles are already pre-funded.&lt;/p&gt;

&lt;h4 id=&quot;eip-7702-authorization-processing&quot;&gt;&lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorization processing&lt;/h4&gt;

&lt;p&gt;While processing each valid authorization, the following charges are applied &lt;strong&gt;at most once per authority&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;if the authority account does not already exist, charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; in state gas for the new account leaf;&lt;/li&gt;
  &lt;li&gt;if this is the first write to the authority within the transaction, charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; in execution gas; the charge is skipped when the write is already paid for, namely when the authority:
    &lt;ul&gt;
      &lt;li&gt;is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.sender&lt;/code&gt;, covered by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt;;&lt;/li&gt;
      &lt;li&gt;was written by a preceding valid authorization;&lt;/li&gt;
      &lt;li&gt;is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.to&lt;/code&gt; of a value-bearing transaction, covered by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt;;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;if the authorization sets a non-zero delegation target, the authority had no delegation indicator at transaction start, and no earlier authorization set one for that authority in this transaction, charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_AUTH_BASE × CPSB&lt;/code&gt; in state gas. Clearing an indicator does not refund this charge or make a later set chargeable again. An indicator present at transaction start can be cleared and re-set without paying this charge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Authorization validation and warming retain the ordering in &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt;: check the chain ID and nonce bound, recover the authority, add it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessed_addresses&lt;/code&gt;, and then check its code and current nonce. An authorization skipped because of the latter checks still warms the recovered authority; one rejected before recovery does not. The state-dependent charges above apply only after validation succeeds, before applying the authorization.&lt;/p&gt;

&lt;h4 id=&quot;account-creation-and-access-charges&quot;&gt;Account creation and access charges&lt;/h4&gt;

&lt;p&gt;If the transaction is not a contract creation, then the following charges are applied:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;if the recipient is non-existent and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.value &amp;gt; 0&lt;/code&gt;, charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; in state gas (never applies to a self-transfer, whose recipient is the already-existing sender);&lt;/li&gt;
  &lt;li&gt;if the recipient is an &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; delegated account, additionally charge the delegation-target access in execution gas: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; if cold, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; if warm.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a contract-creation transaction, if the deployment address does not already exist, per the existence rule of &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;, charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; in state gas.&lt;/p&gt;

&lt;h3 id=&quot;transaction-reference-cases&quot;&gt;Transaction reference cases&lt;/h3&gt;

&lt;p&gt;Costs are split between the intrinsic phase and the runtime phase, each in execution gas and state gas, per &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;. “execution” denotes contract execution charged at the standard schedule; it, and every runtime charge, is drawn from the gas passed into the first frame, so that frame is entered with the gas remaining after the runtime execution and state charges. The recipient touch is charged at the cold rate at the intrinsic phase; the only runtime account access is the delegation-target load, shown at the cold rate — a target warmed beforehand pays &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; rather than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;. Create rows assume the deployment target does not already exist; a pre-existing target pays no new-account state charge. A plain ETH transfer to an existing EOA remains at the legacy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; execution gas; the other rows show the decomposition for each transaction shape.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Case&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Intrinsic (execution / state)&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Runtime (execution / state)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Total (execution / state)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;ETH transfer to self&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;0 / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;12,000 / 0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;No-transfer to EOA / empty account&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;0 / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;15,000 / 0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;No-transfer to contract&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;execution / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;15,000 + execution / 0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;ETH transfer to existing EOA&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS + TX_VALUE_COST&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;0 / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;21,000 / 0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;ETH transfer to contract&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS + TX_VALUE_COST&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;execution / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;21,000 + execution / 0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;No-transfer to 7702 delegated&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; + execution / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;18,000 + execution / 0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;ETH transfer to 7702 delegated&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS + TX_VALUE_COST&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; + execution / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;24,000 + execution / 0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;ETH transfer to self, sender 7702 delegated&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; + execution / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;15,000 + execution / 0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;ETH transfer creating new account&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS + TX_VALUE_COST&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;0 / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;21,000 / 183,600&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Create transaction, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.value&lt;/code&gt; = 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + CREATE_ACCESS&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;0 / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;24,000 / 183,600&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Create transaction, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.value&lt;/code&gt; &amp;gt; 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + CREATE_ACCESS&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;0 / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;24,000 / 183,600&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Create transaction, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.value&lt;/code&gt; &amp;gt; 0, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;created_address.balance&lt;/code&gt; &amp;gt; 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + CREATE_ACCESS&lt;/code&gt; / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;0 / 0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;24,000 / 0&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;interactions-with-other-eips&quot;&gt;Interactions with other EIPs&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt; (warm/cold accounting).&lt;/strong&gt; The sender access folded into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt;, the recipient’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;, and the authority access inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt; are all charged at the intrinsic phase at fixed cold rates, independent of the account’s warm/cold state — an access-list entry for the recipient or an authority does not discount them. The sender, the recipient, and each processed authority are added to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessed_addresses&lt;/code&gt;, so subsequent execution-level touches are warm. The only runtime account access is the delegation-target load, which follows the standard EIP-2929 warm/cold model: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; if cold, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; if warm. The same model governs all execution-level account touches, including internal &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt;s.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/EIPS/eip-2930&quot;&gt;EIP-2930&lt;/a&gt; (access lists).&lt;/strong&gt; Access lists keep their existing per-entry charges and warming semantics for execution-level touches. Listing the recipient or an authority does not reduce the intrinsic cold-rate charges; it only pre-warms the address for execution.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt; (calldata floor).&lt;/strong&gt; EIP-7623 floors a transaction’s cost at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000 + TOTAL_COST_FLOOR_PER_TOKEN × tokens_in_calldata&lt;/code&gt;, where the flat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; is the intrinsic base this EIP decomposes. With this EIP active, that base term is replaced by the transaction’s decomposed base — &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; plus the applicable recipient and value primitives (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt; for a value transfer to a different account, or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt; for contract creation). Per-authorization charges and initcode word charges are excluded from this base, so the floor and its validity check rest on the same per-transaction base as the rest of intrinsic gas rather than a stale constant. Like the floor, this base is state-independent, so the state-dependent runtime charges (the new-account state-gas charge and the delegation-target access) do not enter it. The calldata schedule itself is unchanged; only the base the floor sits on moves.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; (set EOA code).&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; is unchanged when the sender is delegated or an authorization changes its delegation. An authorization supplies a delegation target address, not the target’s code. Computing the intrinsic charge does not require loading that code; resolving a delegation for execution does. When &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.to&lt;/code&gt; is a delegated account, resolving the delegation loads the target’s code, charged &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; on first touch or warm thereafter, following the standard EIP-2929 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessed_addresses&lt;/code&gt; model. Setting a delegation (writing the 23-byte pointer) is distinct from resolving one (reading the target’s code); the resolution charge is genuine work and is not prepaid by the authorization. Authorization cost itself is decomposed: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt; — which already includes the authority’s cold access — is charged per authorization at the intrinsic phase, while the state-dependent charges (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; for a non-existent authority, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; for the first write to the authority within the transaction, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_AUTH_BASE × CPSB&lt;/code&gt; for net-new delegation bytes) are charged at runtime during authorization processing, replacing the worst-case &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PER_EMPTY_ACCOUNT_COST&lt;/code&gt; intrinsic charge and refund.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/EIPS/eip-7708&quot;&gt;EIP-7708&lt;/a&gt; (ETH transfers emit a log).&lt;/strong&gt; Every non-zero-value transfer to a different account emits a transfer log; its cost is folded into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt; alongside the recipient balance write rather than priced as a separate primitive.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; (block-level access lists).&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.sender&lt;/code&gt; is accessed at the intrinsic phase and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.to&lt;/code&gt; at the runtime phase, so both are included in the block-level access list even when the transaction reverts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;intrinsic-versus-runtime-gas&quot;&gt;Intrinsic versus runtime gas&lt;/h3&gt;

&lt;p&gt;The split follows a single line: can the charge be computed without reading state? Signature recovery, the sender’s access and write, the transaction’s block bytes, the value charges, and the per-authorization base are all fixed by the transaction’s fields alone, so they are intrinsic and decide validity. The recipient touch and the authority access are also intrinsic, charged unconditionally at the cold rate: a top-level account is loaded from cold state once per transaction, and pricing that load at a fixed cold rate — rather than discounting the rare case where an access list pre-warmed it — keeps the charge state-independent without underpricing the work. The state-touching remainder is runtime, billed as each account is actually loaded: whether the recipient, an authority, or a deployment target exists, and whether a delegation must be resolved.&lt;/p&gt;

&lt;p&gt;Charging the runtime part as the first frame is entered makes the top-level transaction behave like an ordinary &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt;: a frame is metered against the gas handed to it, and exhausting that gas halts the frame without unwinding the caller’s decision to make the call. Here the “caller” is block inclusion, and the intrinsic check is its decision; a runtime out-of-gas therefore cannot retract validity. Keeping validity on a state-independent quantity is also what lets a block builder decide inclusion without executing the transaction, and lets later EIPs price new state-dependent work at runtime without ever touching the validity boundary.&lt;/p&gt;

&lt;h3 id=&quot;pricing-only-the-work-each-transaction-does&quot;&gt;Pricing only the work each transaction does&lt;/h3&gt;

&lt;p&gt;The decomposition charges each primitive once, where the resource is consumed: signature recovery and the sender’s access and write in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt;; the recipient touch in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;; the recipient balance write and transfer log in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt;; and durable state creation in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt;. A zero-value transaction pays only for the touches it makes, while a value transfer that creates an account pays for the new leaf it adds. This removes the cross-subsidy in the flat base, where simple transactions overpaid and state-creating ones underpaid.&lt;/p&gt;

&lt;p&gt;The new-account state charge does not apply to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt;: the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt; opcode base already prices internal account creation, and top-level contract-creation transactions pay &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt; intrinsically plus the same state-gas charge at runtime when the deployment target does not already exist. Charging the state-growth cost on top-level value transfers that create accounts aligns them with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt;-based creation path, which has always paid for the new leaf.&lt;/p&gt;

&lt;h3 id=&quot;deriving-the-decomposition-from-measured-client-run-times&quot;&gt;Deriving the decomposition from measured client run times&lt;/h3&gt;

&lt;p&gt;The values of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt; are not set by intuition; they are derived from measured client execution times, using the same approach as &lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The derivation uses the EELS &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_ether_transfers_onchain_receivers&lt;/code&gt; benchmark, executed across all major execution-layer clients (Besu, Erigon, Geth, Nethermind, Reth). The benchmark fills blocks with ether transfers to four kinds of receiver, each exercising a different work path:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;transfers to a contract with shared code, where the code lookup is cached across transactions;&lt;/li&gt;
  &lt;li&gt;transfers to a contract with unique 24 KiB code, forcing a fresh code read and JUMPDEST analysis on every transaction (the heaviest path);&lt;/li&gt;
  &lt;li&gt;transfers to an existing EOA;&lt;/li&gt;
  &lt;li&gt;transfers to a non-existent EOA, where the client must create a new account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(client, receiver)&lt;/code&gt; pair, a non-negative least-squares model fits measured block runtime as a linear function of the number of transfers and the number of value-bearing transfers. The two fitted coefficients are the per-transfer base runtime and the additional runtime of moving value. Each coefficient is converted to gas at a fixed throughput anchor of 100 Mgas/s (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas = ceil(100,000 × runtime_ms)&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;For any candidate target, the analysis surfaces each client’s worst case across receiver types, separating clients that already meet the target from those that must optimize to reach it. The proposed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt; are set as such targets: they align intrinsic cost with the resource usage of well-optimized clients while leaving slower clients a defined optimization goal.&lt;/p&gt;

&lt;p&gt;The two empirical coefficients map onto the decomposition as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;the per-transfer base runtime covers signature recovery, the sender’s access and write, and the recipient touch → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS&lt;/code&gt;;&lt;/li&gt;
  &lt;li&gt;the value increment covers the recipient balance write and the transfer log → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; is taken directly from &lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;, since the recipient touch is the same cold-account access priced there. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_VALUE_COST&lt;/code&gt; are the residual parameters this EIP introduces.&lt;/p&gt;

&lt;p&gt;As in &lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;, these numbers are provisional. At the 100 Mgas/s anchor some clients are currently slower than the target on the heaviest paths and must optimize to meet it; the values will be refined as client optimizations land and the benchmarks mature.&lt;/p&gt;

&lt;h3 id=&quot;not-metering-the-transaction-envelope-as-calldata&quot;&gt;Not metering the transaction envelope as calldata&lt;/h3&gt;

&lt;p&gt;Only &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.data&lt;/code&gt; bytes are metered at the calldata schedule; the envelope RLP (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nonce&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas*&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;to&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;value&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;r&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s&lt;/code&gt;) is not. Pricing full-transaction bytes would make intrinsic gas depend on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_limit&lt;/code&gt; and variable-length signature elements — creating a fixed-point estimation problem, since &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_limit&lt;/code&gt; would depend on the signature, which itself encodes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_limit&lt;/code&gt; — and would couple the fee to one serialization, weakening &lt;a href=&quot;/EIPS/eip-2718&quot;&gt;EIP-2718&lt;/a&gt; type neutrality and future encodings. Treating calldata as opaque bytes avoids both issues. A plain ETH transfer carries empty &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.data&lt;/code&gt; and so pays zero calldata gas regardless.&lt;/p&gt;

&lt;h3 id=&quot;self-transfers&quot;&gt;Self-transfers&lt;/h3&gt;

&lt;p&gt;A self-transfer (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.sender == tx.to&lt;/code&gt;) charges neither the recipient touch nor the value cost: the account is already accessed and written as the sender, and EIP-7708 emits no transfer log when sender and recipient coincide. Only &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; applies to the intrinsic base. If the sender is delegated, the delegation-target access and any delegated execution are still charged at runtime.&lt;/p&gt;

&lt;h3 id=&quot;decomposing-authorization-cost&quot;&gt;Decomposing authorization cost&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; charges &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PER_EMPTY_ACCOUNT_COST&lt;/code&gt; per authorization at the intrinsic phase and refunds it when the authority already exists, over-reserving gas the transaction may never use. Splitting the cost removes the over-charge: only &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt; — the calldata, signature recovery, cold authority access, and warm writes every authorization performs — is knowable without state access and stays intrinsic. The new-account leaf, the first-write &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt;, and the delegation-indicator bytes depend on state and are charged at runtime during authorization processing, billed only for the authorities that incur them.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP is &lt;strong&gt;not&lt;/strong&gt; backward compatible. It is a consensus gas repricing that must be activated at a network upgrade. Wallets, RPCs, gas estimators, and any logic that assumes a flat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; intrinsic base must update, particularly to account for the state-gas charge on transactions that create new accounts.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;p&gt;Costs are given as intrinsic + runtime, by case. These examples omit calldata, access-list, and initcode word charges and, except in case 8, authorization charges; executed code is charged separately. Delegation-target accesses shown at the cold rate cost &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; instead when the target is already warm:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Self-transfer (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from == to&lt;/code&gt;): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;12,000&lt;/code&gt; intrinsic, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; runtime. If the sender is 7702-delegated, the delegation-target access is additionally charged at runtime, per case 5.&lt;/li&gt;
  &lt;li&gt;Zero-value transaction to a distinct existing or empty EOA: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;15,000&lt;/code&gt; intrinsic (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS&lt;/code&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; runtime, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; state. A contract recipient additionally pays for execution; a delegated recipient also pays for the delegation-target access. A self-target has a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;12,000&lt;/code&gt; intrinsic base, with delegated execution charged as in case 1.&lt;/li&gt;
  &lt;li&gt;Value transfer to an existing EOA: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; intrinsic, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; runtime, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; state.&lt;/li&gt;
  &lt;li&gt;Value transfer creating a new account (recipient non-existent): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; intrinsic execution; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; = &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;183,600&lt;/code&gt; runtime state.&lt;/li&gt;
  &lt;li&gt;Value transfer to a 7702-delegated account: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; intrinsic + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; runtime = &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;24,000&lt;/code&gt; execution gas plus contract execution.&lt;/li&gt;
  &lt;li&gt;Contract-creation transaction, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;value = 0&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;24,000&lt;/code&gt; intrinsic execution; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;183,600&lt;/code&gt; runtime state if the deployment target did not exist, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; otherwise.&lt;/li&gt;
  &lt;li&gt;Contract-creation transaction, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;value &amp;gt; 0&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;24,000&lt;/code&gt; intrinsic execution (identical to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;value = 0&lt;/code&gt; case, since the recipient balance write is covered by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt;); &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;183,600&lt;/code&gt; runtime state if the deployment target did not exist, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; otherwise.&lt;/li&gt;
  &lt;li&gt;EIP-7702 transaction: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST&lt;/code&gt; is unchanged even when the sender assumes code. Each authorization is charged &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt; (which already covers the cold authority access) at the intrinsic phase; at runtime, a non-existent authority additionally pays &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; state, the first write to the authority within the transaction pays &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; execution, and net-new delegation bytes add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_AUTH_BASE × CPSB&lt;/code&gt; state — replacing the flat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PER_EMPTY_ACCOUNT_COST&lt;/code&gt; intrinsic charge and refund.&lt;/li&gt;
  &lt;li&gt;Contract-creation transaction whose initcode reverts (value-bearing or not): the transaction remains valid; the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;183,600&lt;/code&gt; new-account state-gas charge is refilled in LIFO order per &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt; — credited to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; up to the portion the charge drew from it, with the remainder returning to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Transaction whose gas covers intrinsic cost but not a runtime charge — e.g. a value transfer to a non-existent recipient or a contract creation to a non-existent target lacking gas for the new-account state charge, or a transfer to a delegated account lacking gas for the delegation-target access: the transaction is valid and included, halts out-of-gas, and all runtime state changes — including any applied EIP-7702 delegations — are reverted; it is &lt;strong&gt;not&lt;/strong&gt; invalidated.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Blocks of pure ETH transfers should be tested across all EL clients (e.g. on Perfnet) to confirm the pricing matches measured run times at the chosen throughput anchor.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;The decomposed charges, intrinsic plus runtime, sum to at least the legacy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt; for any transaction that moves value to a distinct, cold account, and add state gas for transactions that grow the state. No path is cheaper than under the flat base in a way that increases per-block resource consumption; the change reallocates cost to match resources and prices state growth that was previously not priced.&lt;/p&gt;

&lt;p&gt;Moving the state-dependent charges to runtime lowers the validity threshold (a simple call is valid at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_BASE_COST + COLD_ACCOUNT_ACCESS&lt;/code&gt; rather than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21,000&lt;/code&gt;), but does not enable underpriced work. A transaction that passes the intrinsic check yet runs out of runtime gas is still included and the sender still pays for every gas unit consumed, with all state changes reverted — exactly the cost profile of an out-of-gas inside a call frame. The runtime mechanism thus charges the same resources as before; it only relocates where, in the lifecycle, the gas is metered.&lt;/p&gt;

&lt;p&gt;The semantics of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; are unchanged. Per &lt;a href=&quot;/EIPS/eip-6780&quot;&gt;EIP-6780&lt;/a&gt;, only contracts created within the same transaction may be fully deleted; this EIP does not reprice or modify any &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; side effects.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Sat, 11 Jul 2020 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-2780</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-2780</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>Slashing Protection Interchange Format</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #3076 - Slashing Protection Interchange Format&lt;/strong&gt; is in Last Call status. It is authored by Michael Sproul (@michaelsproul), Sacha Saint-Leger (@sachayves), Danny Ryan (@djrtwo) and was originally created 2020-10-27. It is in the Interface category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-3076-validator-client-interchange-format-slashing-protection/4883&quot;&gt;https://ethereum-magicians.org/t/eip-3076-validator-client-interchange-format-slashing-protection/4883&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;A standard format for transferring a key’s signing history allows validators to easily switch between clients without the risk of signing conflicting messages. While a common keystore format provides part of the solution, it does not contain any information about a key’s signing history. For a validator moving their keys from client A to client B, this could lead to scenarios in which client B inadvertently signs a message that conflicts with an earlier message signed with client A. The interchange format described here provides a solution to this problem.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;The proof of stake (PoS) protocol penalises validators for voting in ways that could result in two different versions of the chain being finalised. These types of penalties are called slashings.&lt;/p&gt;

&lt;p&gt;For a validator following the protocol correctly, there is, in principle, no risk of being slashed. However, changing clients (from client A to client B, say) can result in a slashing risk if client B is unaware of the blocks and attestations that were signed with client A.&lt;/p&gt;

&lt;p&gt;This can occur if client A and client B do not agree on what the present time is. For example, say client A’s time is accidentally set to a day in the future (225 epochs), and a validator switches from client A to client B without giving B a record of the blocks and attestations signed with A. The validator in question now runs the risk of attesting to two different blocks in the same epoch (a slashable offence) for the next 225 epochs (since they’ve already voted on these epochs with client A, and now stand to vote on them again with client B). Such time-skew bugs have been observed in the wild.&lt;/p&gt;

&lt;p&gt;Another situation in which slashing protection is critical is in the case of re-orgs. During a re-org it is possible for a validator to be assigned new attestation duties for an epoch in which it has already signed an attestation. In this case it is essential that the record of the previous attestation is available, even if the validator just moved from one client to another in the space of a single epoch.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;json-schema&quot;&gt;JSON Schema&lt;/h3&gt;

&lt;p&gt;A valid interchange file is one that adheres to the following JSON schema, and is interpreted according to the &lt;a href=&quot;#conditions&quot;&gt;Conditions&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Signing history&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;This schema provides a record of the blocks and attestations signed by a set of validators&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;metadata&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;interchange_format_version&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;The version of the interchange format that this document adheres to&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;genesis_validators_root&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Calculated at Genesis time; serves to uniquely identify the chain&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;interchange_format_version&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;genesis_validators_root&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;array&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;items&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;pubkey&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;The BLS public key of the validator (encoded as a 0x-prefixed hex string)&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;signed_blocks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;array&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;items&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;slot&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;The slot number of the block that was signed&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;signing_root&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;The output of compute_signing_root(block, domain)&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;slot&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;signed_attestations&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;array&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;items&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;source_epoch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;The attestation.data.source.epoch of the signed attestation&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;target_epoch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;The attestation.data.target.epoch of the signed attestation&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;signing_root&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;The output of compute_signing_root(attestation, domain)&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;source_epoch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;target_epoch&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pubkey&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;signed_blocks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;signed_attestations&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;metadata&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;example-json-instance&quot;&gt;Example JSON Instance&lt;/h3&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;metadata&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;interchange_format_version&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;5&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;genesis_validators_root&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0x04700007fabc8282644aed6d1c7c9e21d38a03a0c4ba193f3afe428824b3a673&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;pubkey&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0xb845089a1457f811bfc000588fbb4e713669be8ce060ea6be3c6ece09afc3794106c91ca73acda5e5457122d58723bed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;signed_blocks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;slot&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;81952&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;signing_root&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0x4ff6f743a43f3b4f95350831aeaf0a122a1a392922c45d804280284a69eb850b&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;slot&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;81951&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;signed_attestations&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;source_epoch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2290&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;target_epoch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;3007&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;signing_root&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0x587d6a4f59a58fe24f406e0502413e77fe1babddee641fda30034ed37ecc884d&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;source_epoch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2290&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;target_epoch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;3008&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;conditions&quot;&gt;Conditions&lt;/h3&gt;

&lt;p&gt;After importing an interchange file with data field &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data&lt;/code&gt;, a signer must respect the following conditions:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Refuse to sign any block that is slashable with respect to the blocks contained in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data.signed_blocks&lt;/code&gt;. For details of what constitutes a slashable block, see &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_proposer_slashing&lt;/code&gt; (from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;consensus-specs&lt;/code&gt;). If the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signing_root&lt;/code&gt; is absent from a block, a signer must assume that any new block with the same &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slot&lt;/code&gt; is slashable with respect to the imported block.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Refuse to sign any block with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slot &amp;lt;= min(b.slot for b in data.signed_blocks if b.pubkey == proposer_pubkey)&lt;/code&gt;, except if it is a repeat signing as determined by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signing_root&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Refuse to sign any attestation that is slashable with respect to the attestations contained in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data.signed_attestations&lt;/code&gt;. For details of what constitutes a slashable attestation, see &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_slashable_attestation_data&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Refuse to sign any attestation with source epoch less than the minimum source epoch present in that signer’s attestations (as seen in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data.signed_attestations&lt;/code&gt;). In pseudocode:&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code class=&quot;language-python3&quot;&gt;source.epoch &amp;lt;
    min(att.source_epoch
        for att in data.signed_attestations
        if att.pubkey == attester_pubkey)
&lt;/code&gt;&lt;/pre&gt;

&lt;ol start=&quot;5&quot;&gt;
  &lt;li&gt;Refuse to sign any attestation with target epoch less than or equal to the minimum target epoch present in that signer’s attestations (as seen in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data.signed_attestations&lt;/code&gt;), except if it is a repeat signing as determined by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signing_root&lt;/code&gt;. In pseudocode:&lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code class=&quot;language-python3&quot;&gt;target_epoch &amp;lt;=
    min(att.target_epoch
        for att in data.signed_attestations
        if att.pubkey == attester_pubkey)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;additional-information&quot;&gt;Additional Information&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;interchange_format_version&lt;/code&gt; version is set to 5.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A signed block or attestation’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signing_root&lt;/code&gt; refers to the message data (hash tree root) that gets signed with a BLS signature. It allows validators to re-sign and re-broadcast blocks or attestations if asked.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signed_blocks&lt;/code&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signing_root&lt;/code&gt;s are calculated using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute_signing_root(block, domain)&lt;/code&gt;: where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block&lt;/code&gt; is the block (of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconBlock&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconBlockHeader&lt;/code&gt;) that was signed, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;domain&lt;/code&gt; is equal to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute_domain(DOMAIN_BEACON_PROPOSER, fork, metadata.genesis_validators_root)&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signed_attestations&lt;/code&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signing_root&lt;/code&gt;s are calculated using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute_signing_root(attestation, domain)&lt;/code&gt;: where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;attestation&lt;/code&gt; is the attestation (of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AttestationData&lt;/code&gt;) that was signed, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;domain&lt;/code&gt; is equal to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute_domain(DOMAIN_BEACON_ATTESTER, fork, metadata.genesis_validators_root)&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;supporting-different-strategies&quot;&gt;Supporting Different Strategies&lt;/h3&gt;

&lt;p&gt;The interchange format is designed to be flexible enough to support the full variety of slashing protection strategies that clients may implement, which may be categorised into two main types:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Complete&lt;/strong&gt;: a database containing every message signed by each validator.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Minimal&lt;/strong&gt;: a database containing only the latest messages signed by each validator.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The advantage of the minimal strategy is its simplicity and succinctness. Using only the latest messages for each validator, safe slashing protection can be achieved by refusing to sign messages for slots or epochs prior.&lt;/p&gt;

&lt;p&gt;On the other hand, the complete strategy can provide safe slashing protection while also avoiding false positives (meaning that it only prevents a validator from signing if doing so would guarantee a slashing).&lt;/p&gt;

&lt;p&gt;The two strategies are unified in the interchange format through the inclusion of &lt;a href=&quot;#conditions&quot;&gt;conditions&lt;/a&gt; (2), (4) and (5). This allows the interchange to transfer detailed or succinct information, as desired.&lt;/p&gt;

&lt;h3 id=&quot;integer-representation&quot;&gt;Integer Representation&lt;/h3&gt;

&lt;p&gt;Most fields in the JSON schema are strings. For fields in which it is possible to encode the value as either a string or an integer, strings were chosen. This choice was made in order to avoid issues with different languages supporting different ranges of integers (specifically JavaScript, where the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;number&lt;/code&gt; type is a 64-bit float). If a validator is yet to sign a block or attestation, the relevant list is simply left empty.&lt;/p&gt;

&lt;h3 id=&quot;versioning&quot;&gt;Versioning&lt;/h3&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;interchange_format_version&lt;/code&gt; is set to 5 because the specification went through several breaking changes during its design, incorporating feedback from implementers.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This specification is not backwards-compatible with previous draft versions that used version numbers less than 5.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;In order to minimise risk and complexity, the format has been designed to map cleanly onto the internal database formats used by implementers. Nevertheless, there are a few pitfalls worth illuminating.&lt;/p&gt;

&lt;h3 id=&quot;advice-for-complete-databases&quot;&gt;Advice for Complete Databases&lt;/h3&gt;

&lt;p&gt;For implementers who use a complete record of signed messages to implement their slashing protection database, we make the following recommendations:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You MUST ensure that, in addition to importing all of the messages from an interchange, all the &lt;a href=&quot;#conditions&quot;&gt;conditions&lt;/a&gt; are enforced. In particular, conditions (2), (4) and (5) may not have been enforced by your implementation before adopting the interchange format. Our recommendation is to enforce these rules at all times, to keep the implementation clean and minimise the attack surface. For example: your slashing protection mechanism should not sign a block with a slot number less than, or equal to, the minimum slot number of a previously signed block, &lt;em&gt;irrespective&lt;/em&gt; of whether that minimum-slot block was imported from an interchange file, or inserted as part of your database’s regular operation.&lt;/li&gt;
  &lt;li&gt;If your database records the signing roots of messages in addition to their slot/epochs, you should ensure that imported messages without signing roots are assigned a suitable dummy signing root internally. We suggest using a special “null” value which is distinct from all other signing roots, although a value like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x0&lt;/code&gt; may be used instead (as it is extremely unlikely to collide with any real signing root).&lt;/li&gt;
  &lt;li&gt;Care must be taken to avoid signing messages within a gap in the database (an area of unknown signing activity). This could occur if two interchanges were imported with a large gap between the last entry of the first and the first entry of the second. Signing in this gap is not safe, and would violate conditions (2), (4) and (5). It can be avoided by storing an explicit low watermark in addition to the actual messages of the slashing protection database, or by pruning on import so that the oldest messages from the interchange become the oldest messages in the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;advice-for-minimal-databases&quot;&gt;Advice for Minimal Databases&lt;/h3&gt;

&lt;p&gt;For implementers who wish to implement their slashing protection database by storing only the latest block and attestation for each validator, we make the following recommendations:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;During import, make sure you take the &lt;em&gt;maximum&lt;/em&gt; slot block and &lt;em&gt;maximum&lt;/em&gt; source and target attestations for each validator. Although the &lt;a href=&quot;#conditions&quot;&gt;conditions&lt;/a&gt; require the minimums to be enforced, taking the maximums from an interchange file and merging them with any existing values in the database is the recommended approach. For example, if the interchange file includes blocks for validator &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;V&lt;/code&gt; at slots 4, 98 and 243, then the latest signed block for validator &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;V&lt;/code&gt; should be updated to the one from slot 243.  However, if the database has already included a block for this validator at a slot greater than 243, for example, slot 351, then the database’s existing value should remain unchanged.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;general-recommendations&quot;&gt;General Recommendations&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;To avoid exporting an outdated interchange file – an action which creates a slashing risk – your implementation should only allow the slashing protection database to be exported when the validator client or signer is &lt;em&gt;stopped&lt;/em&gt; – in other words, when the client or signer is no longer adding new messages to the database.&lt;/li&gt;
  &lt;li&gt;Similarly, your implementation should only allow an interchange file to be imported when the validator client is stopped.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Tue, 27 Oct 2020 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-3076</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-3076</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
      <item>
        <title>EVM trace specification</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #3155 - EVM trace specification&lt;/strong&gt; is in Last Call status. It is authored by Martin Holst Swende (@holiman), Marius van der Wijden (@MariusVanDerWijden) and was originally created 2020-12-07. It is in the Interface category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-3155-create-evm-trace-specification/5007&quot;&gt;https://ethereum-magicians.org/t/eip-3155-create-evm-trace-specification/5007&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Introduce a new JSON standard for EVM traces during execution of state tests.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;The Ethereum Virtual Machine executes all smart contract code on ethereum.
In order to debug smart contracts and state tests better, a common format was introduced to log every execution step of the EVM.
This format was implemented by Go-Ethereum, Parity-Ethereum, Nethermind and Besu.
Since the common format was not well-defined, the implementations differed slightly, making it hard to develop adequate tooling which reduces the usefulness of tracing significantly.&lt;/p&gt;

&lt;p&gt;This EIP has multiple goals:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Move the specification to a more visible place to encourage new clients to implement it&lt;/li&gt;
  &lt;li&gt;Strictly define corner cases that were not addressed in the previous version&lt;/li&gt;
  &lt;li&gt;Allow for updates to the specification in case new fields are introduced during execution&lt;/li&gt;
  &lt;li&gt;Provide sample output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementing this EIP in all major clients allows us to create meaningful differential fuzzers that fuzz EVM implementations for the mainnet and all upcoming hardforks.
It also helps to find differences in execution quickly in the case of a chain split.&lt;/p&gt;

&lt;p&gt;This EIP will enable users to create better differential fuzzing infrastructure to compare the EVM implementations of all major Ethereum clients against each other.
This could help to find bugs that are currently present in the client implementations.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;Clients should be able to execute simple transactions as well as code and return traces. In the following, we will call this client CUT (client under test) and use go-ethereum’s
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm&lt;/code&gt; binary for code examples.&lt;/p&gt;

&lt;h3 id=&quot;datatypes&quot;&gt;Datatypes&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Explanation&lt;/th&gt;
      &lt;th&gt;Example&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Number&lt;/td&gt;
      &lt;td&gt;Plain json number&lt;/td&gt;
      &lt;td&gt;“pc”:0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hex-Number&lt;/td&gt;
      &lt;td&gt;Hex-encoded number&lt;/td&gt;
      &lt;td&gt;“gas”:”0x2540be400”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;String&lt;/td&gt;
      &lt;td&gt;Plain string&lt;/td&gt;
      &lt;td&gt;“opName”:”PUSH1”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hex-String&lt;/td&gt;
      &lt;td&gt;Hex-encoded string&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Array of x&lt;/td&gt;
      &lt;td&gt;Array of x encoded values&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Key-Value&lt;/td&gt;
      &lt;td&gt;Key-Value structure with key and values encoded as hex strings&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Boolean&lt;/td&gt;
      &lt;td&gt;Json bool can either be true or false&lt;/td&gt;
      &lt;td&gt;“pass”: true&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;output&quot;&gt;Output&lt;/h3&gt;

&lt;p&gt;The CUT MUST output a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;json&lt;/code&gt; object for EACH operation.&lt;/p&gt;

&lt;h4 id=&quot;required-fields&quot;&gt;Required Fields&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Explanation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pc&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Number&lt;/td&gt;
      &lt;td&gt;Program Counter&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;op&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Number&lt;/td&gt;
      &lt;td&gt;OpCode&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Hex-Number&lt;/td&gt;
      &lt;td&gt;Gas left before executing this operation&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gasCost&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Hex-Number&lt;/td&gt;
      &lt;td&gt;Gas cost of this operation&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memSize&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Number&lt;/td&gt;
      &lt;td&gt;Size of memory array&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stack&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Array of Hex-Numbers&lt;/td&gt;
      &lt;td&gt;Array of all values on the stack&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;depth&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Number&lt;/td&gt;
      &lt;td&gt;Depth of the call stack&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;returnData&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Hex-String&lt;/td&gt;
      &lt;td&gt;Data returned by function call&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;refund&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Number&lt;/td&gt;
      &lt;td&gt;Amount of &lt;strong&gt;global&lt;/strong&gt; gas refunded&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;optional-fields&quot;&gt;Optional Fields&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Explanation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;opName&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;String&lt;/td&gt;
      &lt;td&gt;Name of the operation&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;error&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Hex-String&lt;/td&gt;
      &lt;td&gt;Description of an error (should contain revert reason if supported)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Array of Hex-Strings&lt;/td&gt;
      &lt;td&gt;Array of all allocated values&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Key-Value&lt;/td&gt;
      &lt;td&gt;Array of all stored values&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{&quot;pc&quot;:0,&quot;op&quot;:96,&quot;gas&quot;:&quot;0x2540be400&quot;,&quot;gasCost&quot;:&quot;0x3&quot;,&quot;memory&quot;:&quot;0x&quot;,&quot;memSize&quot;:0,&quot;stack&quot;:[],&quot;depth&quot;:1,&quot;error&quot;:null,&quot;opName&quot;:&quot;PUSH1&quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stack&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memSize&lt;/code&gt; are the values &lt;em&gt;before&lt;/em&gt; execution of the op.&lt;/li&gt;
  &lt;li&gt;All array attributes (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stack&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory&lt;/code&gt;) MUST be initialized to empty arrays (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;stack&quot;:[]&lt;/code&gt;) NOT to null.&lt;/li&gt;
  &lt;li&gt;If the CUT will not be outputting values for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage&lt;/code&gt; then the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage&lt;/code&gt; fields are omitted.
This can happen either because the CUT does not support tracing these fields or it has been configured not to trace it.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memSize&lt;/code&gt; field MUST be present regardless of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory&lt;/code&gt; support.&lt;/li&gt;
  &lt;li&gt;Clients SHOULD implement a way to disable recording the storage as the stateroot includes all storage updates.&lt;/li&gt;
  &lt;li&gt;Clients SHOULD output the fields in the same order as listed in this EIP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CUT MUST NOT output a line for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STOP&lt;/code&gt; operation if an error occurred:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{&quot;pc&quot;:2,&quot;op&quot;:0,&quot;gas&quot;:&quot;0x2540be3fd&quot;,&quot;gasCost&quot;:&quot;0x0&quot;,&quot;memory&quot;:&quot;0x&quot;,&quot;memSize&quot;:0,&quot;stack&quot;:[&quot;0x40&quot;],&quot;depth&quot;:1,&quot;error&quot;:null,&quot;opName&quot;:&quot;STOP&quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;summary-and-error-handling&quot;&gt;Summary and Error Handling&lt;/h3&gt;

&lt;p&gt;At the end of execution, the CUT MUST print summary info; this info SHOULD have the following fields.
The summary should be a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jsonl&lt;/code&gt; object.&lt;/p&gt;

&lt;h4 id=&quot;required-fields-1&quot;&gt;Required Fields&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Explanation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stateRoot&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Hex-String&lt;/td&gt;
      &lt;td&gt;Root of the state trie after executing the transaction&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;output&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;Return values of the function&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gasUsed&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Hex-Number&lt;/td&gt;
      &lt;td&gt;All gas used by the transaction&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pass&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Boolean&lt;/td&gt;
      &lt;td&gt;Bool whether transaction was executed successfully&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;optional-fields-1&quot;&gt;Optional Fields&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Explanation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Number&lt;/td&gt;
      &lt;td&gt;Time in nanoseconds needed to execute the transaction&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fork&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;String&lt;/td&gt;
      &lt;td&gt;Name of the fork rules used for execution&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;Example&lt;/em&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{&quot;stateRoot&quot;:&quot;0xd4c577737f5d20207d338c360c42d3af78de54812720e3339f7b27293ef195b7&quot;,&quot;output&quot;:&quot;&quot;,&quot;gasUsed&quot;:&quot;0x3&quot;,&quot;pass&quot;:&quot;true&quot;,&quot;time&quot;:141485}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;This EIP is largely based on the previous non-official documentation for EVM tracing.
It tries to cover as many corner cases as possible to enable true client compatibility.
The datatypes and if a field is optional is chosen to be as compatible with current implementations as possible.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP is fully backward compatible with ethereum as it only introduces a better tracing infrastructure that is optional for clients to implement.&lt;/p&gt;

&lt;h3 id=&quot;clients&quot;&gt;Clients&lt;/h3&gt;

&lt;p&gt;This EIP is fully backward compatible with go-ethereum. OpenEthereum, Besu and Nethermind clients would have to change their JSON output of
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;openethereum-evm&lt;/code&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evmtool&lt;/code&gt; and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nethtest&lt;/code&gt; slightly do adhere to the new and stricter specs. New clients would need to implement this change if they want to be part of the differential fuzzing group.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BESU_HOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/bin/evmtool &lt;span class=&quot;nt&quot;&gt;--code&lt;/span&gt; 0x604080536040604055604060006040600060025afa6040f3 &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540be400&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[],&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;PUSH1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:2,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:128,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540be3fd&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;DUP1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:3,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:83,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540be3fa&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0xc&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;MSTORE8&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:4,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540be3ee&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[],&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;PUSH1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:6,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540be3eb&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;PUSH1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:8,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:85,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540be3e8&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x4e20&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;SSTORE&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:9,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b95c8&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[],&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;PUSH1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:11,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b95c5&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;PUSH1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:13,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b95c2&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x0&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;PUSH1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:15,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b95bf&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;PUSH1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:17,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b95bc&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x0&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;PUSH1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:19,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:90,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b95b9&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x2&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;GAS&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:20,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:250,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b95b7&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x24abb676c&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x2&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b95b7&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;STATICCALL&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:21,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b92a7&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x3&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;returnData&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;PUSH1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pc&quot;&lt;/span&gt;:23,&lt;span class=&quot;s2&quot;&gt;&quot;op&quot;&lt;/span&gt;:243,&lt;span class=&quot;s2&quot;&gt;&quot;gas&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x2540b92a4&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasCost&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memory&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;memSize&quot;&lt;/span&gt;:96,&lt;span class=&quot;s2&quot;&gt;&quot;stack&quot;&lt;/span&gt;:[&lt;span class=&quot;s2&quot;&gt;&quot;0x1&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;returnData&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;depth&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;refund&quot;&lt;/span&gt;:0,&lt;span class=&quot;s2&quot;&gt;&quot;opName&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;RETURN&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;stateRoot&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x8fa0dcc7f1d2383c89e5737c2843632db881c0946e80b71fe7175365e6538797&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;output&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x40&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;gasUsed&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;0x515c&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;pass&quot;&lt;/span&gt;:true,&lt;span class=&quot;s2&quot;&gt;&quot;fork&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;Istanbul&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;Tracing is expensive.&lt;/p&gt;

&lt;p&gt;Exposing an endpoint for creating traces publicly could open up a denial of service vector.&lt;/p&gt;

&lt;p&gt;Clients should consider putting trace endpoints behind a separate flag from other endpoints.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Mon, 07 Dec 2020 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-3155</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-3155</guid>
      </item>
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
      <item>
        <title>Empty accounts deprecation</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7523 - Empty accounts deprecation&lt;/strong&gt; is in Last Call status. It is authored by Peter Davies (@petertdavies) and was originally created 2023-09-19. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7523-empty-accounts-deprecation/15870&quot;&gt;https://ethereum-magicians.org/t/eip-7523-empty-accounts-deprecation/15870&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP prohibits the state of any post-merge network from containing empty accounts. Since no empty accounts exist outside the testsuite and no new ones can be created this requirement is already achieved in practice. An explicit ban reduces technical debt going forward.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;The possibility of empty accounts is a historical artifact of the early history of Ethereum. The only networks that have ever been capable of containing them are Ethereum Mainnet, the deprecated testnet Ropsten, Etheruem Classic Mainnet and various Ethereum Classic testnets. All remaining empty accounts on Mainnet were cleared in block &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;14049881&lt;/code&gt; (transaction &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xf955834bfa097458a9cf6b719705a443d32e7f43f20b9b0294098c205b4bcc3d&lt;/code&gt;) and a similar transaction was sent on Ethereum Classic. None of the other myriad EVM-compatible networks are old enough to have empty accounts and there is no realistic prospect that anyone will encounter an empty account in a production context.&lt;/p&gt;

&lt;p&gt;Despite empty accounts no longer existing, they still impose a legacy of technical debt. &lt;a href=&quot;/EIPS/eip-161&quot;&gt;EIP-161&lt;/a&gt; imposes complicated rules that require a client to delete an empty account when it is “touched”. As the Ethereum specification continues to evolve new edgecases of the “touch” rules arise which must be debated, implemented, tested and documented. If a future client wishes to only support post-merge blocks it must implement unnecessary empty account support solely to pass the test suite.&lt;/p&gt;

&lt;p&gt;By prohibiting empty accounts on post-merge networks, this EIP frees designers and implementers of Ethereum and related blockchains from the burden of having to consider them going forward.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119 and RFC 8174.&lt;/p&gt;

&lt;p&gt;An empty account is an account with has &lt;strong&gt;no code&lt;/strong&gt; and &lt;strong&gt;zero nonce&lt;/strong&gt; and &lt;strong&gt;zero balance&lt;/strong&gt;. This is the same as the definition in &lt;a href=&quot;/EIPS/eip-161&quot;&gt;EIP-161&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On networks that undergo the merge transition, the pre state of the merge block may not contain any empty accounts. For networks that are merged at genesis, none of the genesis accounts may be empty accounts.&lt;/p&gt;

&lt;p&gt;Rather than performing a scan of the state, clients MAY assume the following chains have no post-merge empty accounts:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The Mainnet chain whose merge block has hash &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x56a9bb0302da44b8c0b3df540781424684c3af04d0b7a38d72842b762076a664&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Any chain which satisfies all of the following:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;has no empty accounts in the genesis.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;had a post Spurious Dragon fork at genesis.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Ethereum specification is declared to be undefined in the presence of an empty account in a post-merge context. Any testcase involving post-merge empty accounts is invalid.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;This EIP was drafted to be the simplest possible way of eliminating the long term technical debt imposed by empty accounts. The Merge was chosen as a natural easily identifiable cutoff point.&lt;/p&gt;

&lt;p&gt;Alternative approaches include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Using an earlier cutoff point, such as block &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;14049881&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Identifying a wider range of edge case behaviour that never happened.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These approaches were rejected as being unnecessarily complicated.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;As EIP does not change any behaviour that can occur outside the testsuite, it has no backwards compatibility consequences.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;The validity of this EIP is dependent on the assertion that all empty accounts on Ethereum Mainnet were cleared prior to the merge. This should be subject to appropriate verification.&lt;/p&gt;

&lt;p&gt;Any networks artificially created with empty accounts will cause problems with tooling and clients.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Tue, 19 Sep 2023 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7523</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7523</guid>
      </item>
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>Revert creation in case of non-empty storage</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7610 - Revert creation in case of non-empty storage&lt;/strong&gt; is in Last Call status. It is authored by Gary Rong (@rjl493456442), Martin Holst Swende (@holiman) and was originally created 2024-02-02. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-revert-creation-in-case-of-non-empty-storage/18452&quot;&gt;https://ethereum-magicians.org/t/eip-revert-creation-in-case-of-non-empty-storage/18452&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP causes contract creation to throw an error when attempted at an address with pre-existing storage.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119 and RFC 8174.&lt;/p&gt;

&lt;p&gt;If a contract creation is attempted due to a creation transaction, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt; opcode, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; opcode, or any other reason, and the destination address already has either a nonzero nonce, a nonzero code length, or non-empty storage, then the creation MUST throw as if the first byte in the init code were an invalid opcode. This change MUST apply retroactively for all existing blocks.&lt;/p&gt;

&lt;p&gt;This EIP amends &lt;a href=&quot;/EIPS/eip-684&quot;&gt;EIP-684&lt;/a&gt; with one extra condition, requiring empty storage for contract deployment.&lt;/p&gt;

&lt;p&gt;This EIP will not affect &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt;, since the authority’s nonce is always incremented after an authorization is applied, which conflicts with the condition required for contract deployment.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;EIP-684 defines two conditions for contract deployment: the destination address must have zero nonce and zero code length. Unfortunately, this is not sufficient. Before &lt;a href=&quot;/EIPS/eip-161&quot;&gt;EIP-161&lt;/a&gt; was applied, the nonce of a newly deployed contract remained set to zero. Therefore, it was entirely possible to create a contract with a zero nonce and zero code length but with non-empty storage, if slots were set in the constructor. There exists 28 such contracts on Ethereum mainnet at this time.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This is an execution layer upgrade, and so it requires a hard fork.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;p&gt;There exists quite a number of tests in the ethereum tests repo as well as in the execution spec tests, which test the scenario of deployment to targets with non-empty storage. These tests have been considered problematic in the past; Reth and EELS both intentionally implement a version of the account reset solely to pass the tests. Py-evm declared the situation impossible and never implemented account reset.&lt;/p&gt;

&lt;p&gt;Refilling the existing tests will provide sufficient coverage for this EIP.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;This EIP is a security upgrade: it enforces the immutability of deployed code.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 02 Feb 2024 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7610</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7610</guid>
      </item>
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>ETH transfers emit a log</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7708 - ETH transfers emit a log&lt;/strong&gt; is in Last Call status. It is authored by Vitalik Buterin (@vbuterin), Peter Davies (@petertdavies), Etan Kissling (@etan-status), Gajinder Singh (@g11tech), Carson (@carsons-eels), Jared Wasinger (@jwasinger) and was originally created 2024-05-17. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7708-eth-transfers-emit-a-log/20034&quot;&gt;https://ethereum-magicians.org/t/eip-7708-eth-transfers-emit-a-log/20034&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;All ETH transfers emit a log.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;Logs are often used to track when balance changes of assets on Ethereum. Logs work for &lt;a href=&quot;/EIPS/eip-20&quot;&gt;ERC-20&lt;/a&gt; tokens, but they do not work for ETH. ETH transfers from EOAs can be read from the transaction list in the block, but ETH transfers from smart contract wallets are not automatically logged anywhere. This has already led to problems in the past, eg. early exchanges would often not properly support deposits from smart contract wallets, or only support them with a much longer delay. This EIP proposes that we automatically generate a log every time a value-transferring &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; happens. We also add a similar log for transfers in transactions, so that all ETH transfers can be tracked using one mechanism.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;eth-transfer-logs&quot;&gt;ETH transfer logs&lt;/h3&gt;

&lt;p&gt;A log, identical to a LOG3, is issued for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Any nonzero-value-transferring transaction to a different account, before any other logs created by EVM execution&lt;/li&gt;
  &lt;li&gt;Any nonzero-value-transferring &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; to a different account, at the time that the value transfer executes&lt;/li&gt;
  &lt;li&gt;Any nonzero-value-transferring &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; to a different account, at the time that the value transfer executes&lt;/li&gt;
  &lt;li&gt;Any nonzero-value-transferring &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; to the created account, at the time that the value transfer executes&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Field&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;address&lt;/code&gt; emitting log&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xfffffffffffffffffffffffffffffffffffffffe&lt;/code&gt; (&lt;a href=&quot;/EIPS/eip-4788&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYSTEM_ADDRESS&lt;/code&gt;&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;topics[0]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keccak256(&apos;Transfer(address,address,uint256)&apos;)&lt;/code&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;topics[1]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from&lt;/code&gt; address (zero prefixed to fill uint256)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;topics[2]&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;to&lt;/code&gt; address (zero prefixed to fill uint256)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;amount&lt;/code&gt; in Wei (big endian uint256)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;This matches the &lt;a href=&quot;/EIPS/eip-20&quot;&gt;ERC-20&lt;/a&gt; Transfer event definition.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;This is the simplest possible implementation that ensures that all ETH transfers are implemented in some kind of record that can be easily accessed through making RPC calls into a node, or through asking for a Merkle branch that is hashed into the block root. The log type is compatible with the ERC-20 token standard, but does not introduce any overly-specific ERC-20 features (eg. ABI encodings) into the specification.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYSTEM_ADDRESS&lt;/code&gt; is reused as the log emitter for consistency with other protocol-originated operations (e.g. &lt;a href=&quot;/EIPS/eip-4788&quot;&gt;EIP-4788&lt;/a&gt;) and to distinguish these protocol-generated logs from logs emitted by user contracts.&lt;/p&gt;

&lt;p&gt;Fee payment logs for priority fees paid to the coinbase were considered. However, they are a distinct category from transfers, and adding these logs to this EIP would explode the log volume in a way that raises the intrinsic cost of transfer logs (and therefore transactions), putting an unreasonable load on the network. Clients can already compute these fee amounts from the block header and transaction receipt, so it is unnecessary to log them. The base fee burn is excluded for the same reason: the burned amount is already derivable from the block header.&lt;/p&gt;

&lt;p&gt;Withdrawals were also considered, but they are not attached to a transaction, which means there is no natural emission point. Additionally, they are already easily derivable from block information. Adding these kinds of logs would duplicate data already available to clients.&lt;/p&gt;

&lt;p&gt;Clients who wish to provide a unified view for consumers MAY expose a new aggregating RPC.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;h3 id=&quot;eth-burns-via-selfdestruct&quot;&gt;ETH burns via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;After &lt;a href=&quot;/EIPS/eip-8246&quot;&gt;EIP-8246&lt;/a&gt;, ETH can no longer be burned via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; to self or by sending ETH to an account marked for selfdestruction. Therefore, this EIP does not specify this edge-case.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Transfer log emission for plain transactions, EOAs, delegated EOAs, and across all transaction types&lt;/li&gt;
  &lt;li&gt;Transfer logs across the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; family and how the executing context attributes the sender&lt;/li&gt;
  &lt;li&gt;Transfer logs for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; endowments, initcode behavior, and failure modes&lt;/li&gt;
  &lt;li&gt;Transfer logs for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; to self vs. a different beneficiary, including pre-existing and cross-tx contracts&lt;/li&gt;
  &lt;li&gt;Log ordering: Transfer logs appear before any EVM-emitted logs in a transaction, and nested-&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; Transfer logs appear in chronological call order&lt;/li&gt;
  &lt;li&gt;Negative cases where no log is emitted (zero-value, reverts, rolled-back inner calls, fee payments)&lt;/li&gt;
  &lt;li&gt;Transfers to special-purpose addresses (precompiles, the system address, the coinbase)&lt;/li&gt;
  &lt;li&gt;Fork transition behavior at the EIP-7708 activation boundary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test cases for this EIP can be found in the Execution Layer Specification suite &lt;a href=&quot;https://github.com/ethereum/execution-specs/tree/155c3e136d81dcd5c61086c9d832595b7641db4a/tests/amsterdam/eip7708_eth_transfer_logs&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eip7708_eth_transfer_logs&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;ETH transfers already cost a minimum of 6700 gas, which is much more expensive than the LOG3 opcode (1500 gas). Hence, this EIP does not increase the worst-case number of logs that can be put into a block. It will somewhat increase the average number of logs.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 17 May 2024 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7708</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7708</guid>
      </item>
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
      <item>
        <title>Network Upgrade Inclusion Stages</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7723 - Network Upgrade Inclusion Stages&lt;/strong&gt; is in Last Call status. It is authored by Tim Beiko (@timbeiko), Alex Stokes (@ralexstokes), Ansgar Dietrichs (@adietrichs), Nixo (@nixorokish), Parithosh Jayanthi (@parithosh) and was originally created 2024-06-12. It is in the  category of type Meta. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7723-network-upgrade-inclusion-stages/20281&quot;&gt;https://ethereum-magicians.org/t/eip-7723-network-upgrade-inclusion-stages/20281&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Defines the stages that EIPs go through in the process of planning network upgrades: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed for Inclusion&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Included&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;This EIP proposes definitions for the various stages EIPs go through when planning network upgrades. It also provides context and guidelines around when and how EIPs should be moved from one stage to the next.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119 and RFC 8174.&lt;/p&gt;

&lt;p&gt;All EIP stages apply to a single network upgrade. EIPs must be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled&lt;/code&gt; separately for each network upgrade. While an EIP cannot be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Included&lt;/code&gt; in two network upgrades, an EIP being &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; in a previous upgrade does not prevent it from being &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled&lt;/code&gt; for inclusion in any future upgrade.&lt;/p&gt;

&lt;p&gt;The stages below are generally defined for Standards Track - Core EIPs, which must be activated synchronously by all nodes on a network. To help with prioritization and communications, non-Core EIPs may also be assigned these stages. The differences in the process and implications for non-Core EIPs are noted in each stage’s definition.&lt;/p&gt;

&lt;h3 id=&quot;upgrade-meta-eips&quot;&gt;Upgrade Meta EIPs&lt;/h3&gt;

&lt;p&gt;Anyone &lt;strong&gt;MAY&lt;/strong&gt; draft a Meta EIP to list EIPs for a network upgrade. This Meta EIP &lt;strong&gt;SHOULD&lt;/strong&gt; include four categories in its specification section: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed for Inclusion&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt;. Even if a category is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TBD&lt;/code&gt;, it &lt;strong&gt;SHOULD&lt;/strong&gt; be included in the initial draft for clarity.&lt;/p&gt;

&lt;p&gt;When the Upgrade Meta EIP is moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Review&lt;/code&gt;, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed for Inclusion&lt;/code&gt; and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; list &lt;strong&gt;SHOULD&lt;/strong&gt; be removed. When it is moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Last Call&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt; lists &lt;strong&gt;SHOULD&lt;/strong&gt; be removed, leaving only the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt; list.&lt;/p&gt;

&lt;p&gt;Before the Upgrade Meta EIP is moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Final&lt;/code&gt;, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt; stage &lt;strong&gt;MUST&lt;/strong&gt; be renamed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Included&lt;/code&gt; and contain only EIPs that were activated with the upgrade.&lt;/p&gt;

&lt;h3 id=&quot;upgrade-devnets&quot;&gt;Upgrade Devnets&lt;/h3&gt;

&lt;p&gt;When preparing a network upgrade, client developers typically implement EIPs first on an ephemeral test network (upgrade devnet) to verify client interoperability before deploying to long-lived test networks. These upgrade devnets follow a naming convention of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;upgradeName-devnet-version&lt;/code&gt; (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pectra-devnet-0&lt;/code&gt; for the first upgrade devnet of the Pectra network upgrade, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dencun-devnet-1&lt;/code&gt; for the second upgrade devnet of the Dencun update, etc).&lt;/p&gt;

&lt;p&gt;Since client developers’ ability to include EIPs in a network upgrade is constrained by what can be implemented and tested in these upgrade devnets, the &lt;a href=&quot;#considered-for-inclusion&quot;&gt;Considered for Inclusion&lt;/a&gt; and &lt;a href=&quot;#scheduled-for-inclusion&quot;&gt;Scheduled for Inclusion&lt;/a&gt; sections below propose aligning these statuses with EIPs’ implementation status in upgrade devnets.&lt;/p&gt;

&lt;h3 id=&quot;proposed-for-inclusion&quot;&gt;Proposed for Inclusion&lt;/h3&gt;

&lt;p&gt;To propose an EIP for inclusion, someone &lt;strong&gt;MUST&lt;/strong&gt; open a pull request to add it to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed for Inclusion&lt;/code&gt; (PFI) section of the Upgrade Meta EIP. The proposer of an EIP &lt;strong&gt;SHOULD&lt;/strong&gt; serve as the primary point of contact for that EIP for the duration of the upgrade cycle or &lt;strong&gt;SHOULD&lt;/strong&gt; designate another person to serve in that role. Reasonable pull requests &lt;strong&gt;SHOULD&lt;/strong&gt; be merged in a timely fashion by the Upgrade Meta EIP author.&lt;/p&gt;

&lt;p&gt;At this stage, implementation teams &lt;strong&gt;SHOULD&lt;/strong&gt; review the EIP. For Core EIPs, this should be in the context of including it in the said upgrade. For non-Core EIPs, this should be in the context of supporting Core EIPs before the network upgrade is activated.&lt;/p&gt;

&lt;p&gt;Note that EIPs must be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed for Inclusion&lt;/code&gt; for each network upgrade. In other words, proposals do not “carry over” to the next upgrade if an EIP is not included in the one it was first proposed for.&lt;/p&gt;

&lt;h3 id=&quot;considered-for-inclusion&quot;&gt;Considered for Inclusion&lt;/h3&gt;

&lt;p&gt;Once client developers have reviewed an EIP which was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed for Inclusion&lt;/code&gt;, they &lt;strong&gt;MAY&lt;/strong&gt; move it to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt; (CFI) stage. Once a decision is made by client teams to move an EIP to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt;, the Upgrade Meta EIP &lt;strong&gt;SHOULD&lt;/strong&gt; be updated to reflect this.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt; signals that client developers intend to attempt to include the EIP in devnets. The All Core Devs Execution (ACDE) and Consensus (ACDC) call facilitators should work with the testing teams to propose a priority ordering of CFI EIPs to be reviewed by client developers, and then reflect this prioritization in the Meta EIP. This prioritization should inform which EIPs should be included in upcoming devnets, with some flexibility if circumstances change.&lt;/p&gt;

&lt;p&gt;Assuming it meets all the requirements for mainnet deployment it &lt;strong&gt;MAY&lt;/strong&gt; be included in the network upgrade. This stage is similar to “concept ACK” in other open source projects, and is not sufficient to result in deployment to mainnet.&lt;/p&gt;

&lt;p&gt;Non-Core EIPs that are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt; &lt;strong&gt;SHOULD&lt;/strong&gt; be supported prior to the network upgrade being activated.&lt;/p&gt;

&lt;p&gt;An EIP &lt;strong&gt;MAY&lt;/strong&gt; be moved from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; if client teams are against including the EIP in the network upgrade.&lt;/p&gt;

&lt;p&gt;An EIP &lt;strong&gt;SHOULD&lt;/strong&gt; have a Python implementation accompanied by tests in &lt;a href=&quot;https://github.com/ethereum/execution-specs/blob/78fb726158c69d8fa164e28f195fabf6ab59b915/README.md&quot;&gt;execution-specs&lt;/a&gt; submitted as an open PR. The EIP writer is encouraged to reach out to the maintainers of execution-specs for assistance with implementation. Client developers &lt;strong&gt;MAY&lt;/strong&gt; decide to allow an EIP to be moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt; without either implementation, being aware that the absence of these implementations could lead to delays in the testing cycle.&lt;/p&gt;

&lt;p&gt;Any updates to an EIP that is already at this stage &lt;strong&gt;SHOULD&lt;/strong&gt; be accompanied by the appropriate updates to its implementation and tests in &lt;a href=&quot;https://github.com/ethereum/execution-specs/blob/78fb726158c69d8fa164e28f195fabf6ab59b915/README.md&quot;&gt;execution-specs&lt;/a&gt; if deemed necessary by client developers.&lt;/p&gt;

&lt;h3 id=&quot;declined-for-inclusion&quot;&gt;Declined for Inclusion&lt;/h3&gt;

&lt;p&gt;At any time during the network upgrade planning process, client developers &lt;strong&gt;MAY&lt;/strong&gt; move EIPs from any other stage to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; (DFI) stage if client teams are against including the EIP in the network upgrade. Once a decision is made by client teams to move an EIP to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt;, the Upgrade Meta EIP &lt;strong&gt;SHOULD&lt;/strong&gt; be updated to reflect this.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; signals that client developers wish to exclude the EIP from the current network upgrade and stop discussing its potential inclusion or implementation status in relation to this upgrade. An EIP which was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; in a particular upgrade &lt;strong&gt;MAY&lt;/strong&gt; still be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed for Inclusion&lt;/code&gt; in a subsequent upgrade. In exceptional circumstances, client developers &lt;strong&gt;MAY&lt;/strong&gt; choose to move an EIP from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;scheduled-for-inclusion&quot;&gt;Scheduled for Inclusion&lt;/h3&gt;

&lt;p&gt;An EIP can be moved to Scheduled for Inclusion (SFI) when core developers:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Agree upon a strong intent to include the EIP in the next network upgrade.&lt;/li&gt;
  &lt;li&gt;Agree that an EIP’s specifications and implementations have reached a certain level of maturity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I.e., an SFI status signals that the EIP is on track for inclusion barring unforeseen issues.&lt;/p&gt;

&lt;p&gt;The following critieria can be applied to ascertain whether an EIP is mature (stable) enough to move to SFI:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It has been included in a devnet that has demonstrated stability (e.g., high participation, no critical bugs for ≥1 week).&lt;/li&gt;
  &lt;li&gt;The EIP specification is close to final (no placeholder values or pending design decisions).&lt;/li&gt;
  &lt;li&gt;It has minimal interactions with other CFI EIPs, OR those interactions have been tested in the same devnet.&lt;/li&gt;
  &lt;li&gt;Testing coverage is adequate (clients pass consensus tests, no known divergence across clients).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All Core Devs Testing (ACDT) calls may review EIPs to determine SFI eligibility. Status changes will then be ratified on ACDE or ACDC before assigning SFI status.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt; signals that the EIP is on track for inclusion barring unforeseen issues. EIPs with incomplete specs or untested interactions should remain CFI until these conditions are met. The latest Upgrade Devnet must contain all &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt; Core EIPs.&lt;/p&gt;

&lt;p&gt;An EIP &lt;strong&gt;MAY&lt;/strong&gt; be moved from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; if circumstances necessitate removal, as agreed by client teams. An EIP &lt;strong&gt;MAY&lt;/strong&gt; also be moved from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt; if client teams remain in favor of including the EIP in the network upgrade but cannot commit to including it in the &lt;strong&gt;next&lt;/strong&gt; Upgrade Devnet.&lt;/p&gt;

&lt;p&gt;An EIP &lt;strong&gt;MUST&lt;/strong&gt; have a Python implementation accompanied by tests in &lt;a href=&quot;https://github.com/ethereum/execution-specs/blob/5cdb055e069e246a877c8aa018079eb0b9093f57/README.md&quot;&gt;execution-specs&lt;/a&gt;, submitted as an open PR or merged to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;devnets/upgradeName/version&lt;/code&gt; branch of the repository. Client developers &lt;strong&gt;MAY&lt;/strong&gt; decide to allow an EIP to be moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt; without an &lt;a href=&quot;https://github.com/ethereum/execution-specs/blob/5cdb055e069e246a877c8aa018079eb0b9093f57/README.md&quot;&gt;execution-specs&lt;/a&gt; implementation, but the tests are strictly mandatory.&lt;/p&gt;

&lt;p&gt;Any updates to an EIP that is already at this stage &lt;strong&gt;MUST&lt;/strong&gt; be accompanied by appropriate updates to its implementation and tests in &lt;a href=&quot;https://github.com/ethereum/execution-specs/blob/5cdb055e069e246a877c8aa018079eb0b9093f57/README.md&quot;&gt;execution-specs&lt;/a&gt; if deemed necessary by client developers.&lt;/p&gt;

&lt;h3 id=&quot;included&quot;&gt;Included&lt;/h3&gt;

&lt;p&gt;After network upgrade activation, all included Core EIPs and activated non-Core EIPs &lt;strong&gt;MUST&lt;/strong&gt; be moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Included&lt;/code&gt; in the Meta EIP. All other status lists &lt;strong&gt;MUST&lt;/strong&gt; be removed from the Meta EIP.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Included&lt;/code&gt; signals that the EIPs have been activated as part of the network upgrade.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;Formalizing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Proposed for Inclusion&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Considered for Inclusion&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduled for Inclusion&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Declined for Inclusion&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Included&lt;/code&gt; stages provides better legibility to both protocol maintainers and the broader Ethereum community.&lt;/p&gt;

&lt;p&gt;The specification tries to minimize steps that &lt;strong&gt;MUST&lt;/strong&gt; be followed to align with Ethereum’s “rough consensus” governance model.&lt;/p&gt;

&lt;p&gt;Assuming it is adopted, the process outlined in this EIP should be used for at least one full network upgrade cycle before moving to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Last Call&lt;/code&gt; and at least two full network upgrade cycles before moving to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Final&lt;/code&gt;. This way, the EIP can be updated to reflect changes made to the process over time.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP does not directly change the Ethereum protocol. It formalizes parts of the current network upgrade planning process.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;None.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Wed, 12 Jun 2024 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7723</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7723</guid>
      </item>
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
      <item>
        <title>Enshrined Proposer-Builder Separation</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7732 - Enshrined Proposer-Builder Separation&lt;/strong&gt; is in Last Call status. It is authored by Francesco D&apos;Amato &lt;francesco.damato@ethereum.org&gt;, Nico Flaig &lt;nflaig@protonmail.com&gt;, Barnabé Monnot &lt;barnabe.monnot@ethereum.org&gt;, Michael Neuder &lt;michael.neuder@ethereum.org&gt;, Potuz (@potuz), Justin Traglia &lt;jtraglia@ethereum.org&gt;, Terence Tsao &lt;ttsao@offchainlabs.com&gt; and was originally created 2024-06-28. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7732-enshrined-proposer-builder-separation-epbs/19634&quot;&gt;https://ethereum-magicians.org/t/eip-7732-enshrined-proposer-builder-separation-epbs/19634&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP fundamentally changes the way an Ethereum block is validated by decoupling the execution validation from the consensus validation both logically as well as temporally. It does so by introducing a new in-protocol entity called &lt;em&gt;builders&lt;/em&gt; and adding a new duty (submitting &lt;em&gt;payload timeliness attestations&lt;/em&gt;) to Ethereum validators. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayload&lt;/code&gt; field of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconBlockBody&lt;/code&gt; is removed and instead it is replaced by a signed commitment (a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedExecutionPayloadBid&lt;/code&gt; object) from a builder to later reveal the corresponding execution payload. This commitment specifies in particular the blockhash of the execution block and a &lt;em&gt;value&lt;/em&gt; to be paid to the beacon block proposer. When processing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconBlock&lt;/code&gt;, the committed value is deducted from the builder’s beacon chain balance and later a withdrawal is placed to an address, of the proposer’s choosing, in the execution layer. A subset of validators in the beacon committee is assigned to the &lt;em&gt;Payload Timeliness Committee&lt;/em&gt; (PTC), these validators are tasked to attest (by broadcasting a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PayloadAttestationMessage&lt;/code&gt;) to whether the corresponding builder has revealed the committed execution payload (with the right blockhash) in a timely fashion and whether the correspoding blob data was available according to their view. PTC members are not required to validate the execution payload, execution validation is thus deferred until the next beacon block validation. While builder’s are staked entities, their stake is not actively validating the beacon chain, they are not subject to the usual deposit and exit churn/queues and can be staked for as little as 1ETH. While the in-protocol payment via withdrawals is trustlessly deducted from this stake, the protocol also accomodates for trusted payments in the form of &lt;em&gt;promises&lt;/em&gt; to be fulfiled elsewhere.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;This EIP solves a different set of unrelated important problems.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;An overwhelming majority of beacon block proposers outsource the construction of the execution payload within their blocks to a third party (henceforth called a &lt;em&gt;builder&lt;/em&gt;). In order to do so, they request the hash tree root (HTR) of a promised execution payload and submit a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedBlindedBeaconBlock&lt;/code&gt; to a trusted party that is tasked with replacing the HTR with the full execution payload (received from the builder) before broadcasting. This EIP allows for a trust-free fair exchange between the beacon block proposer and the builder, guaranteeing that an honest beacon block proposer will receive payment from the builder regardless of the latter’s actions and that the honest builder’s payload will be the canonical head of the chain regardless of the proposer’s action.&lt;/li&gt;
  &lt;li&gt;Currently, validators have the time between receiving the full beacon block (including an execution payload) and the attesting deadline (4 seconds in Ethereum mainnet) to perform both consensus and execution state transition functions, check blob data availability and evaluate the new head of the blockchain. The remainder of the slot time is spent doing less CPU-intense and critical task. By separating the validation of the execution and consensus part of the block, validators are only tasked to perform the consensus state transition function in this critical time before attesting, while execution and data availability validation is deferred for most of the remainder of the slot (between the builder’s reveal time and the next attestation deadline).&lt;/li&gt;
  &lt;li&gt;By removing the full execution payload size from the consensus block, it allows for faster network propagation on the critical path.&lt;/li&gt;
  &lt;li&gt;It removes the increased reorg likeliness of including blob transactions in blocks given the natural increase in timelines for data availability checks and the fact that the builder may broadcast the blob sidecars even before attestations for the beacon block have been released.&lt;/li&gt;
  &lt;li&gt;It prevents validators from missing attestations and strengthens the weight properties of fork choice in the event that builders produce invalid payloads.&lt;/li&gt;
  &lt;li&gt;It removes the need to use trusted middleware in order to delegate block construction to a builder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;execution-layer&quot;&gt;Execution Layer&lt;/h3&gt;

&lt;p&gt;No changes are required.&lt;/p&gt;

&lt;h3 id=&quot;consensus-layer&quot;&gt;Consensus Layer&lt;/h3&gt;

&lt;p&gt;The full consensus changes can be found in the consensus-specs Github repository. They are split between:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/ethereum/consensus-specs/blob/c94138e73e0e70eb4b27f9be4d4e9325fa1aebf7/specs/gloas/beacon-chain.md&quot;&gt;Beacon Chain&lt;/a&gt; changes.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/ethereum/consensus-specs/blob/c94138e73e0e70eb4b27f9be4d4e9325fa1aebf7/specs/gloas/fork-choice.md&quot;&gt;Fork choice&lt;/a&gt; changes.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/ethereum/consensus-specs/blob/c94138e73e0e70eb4b27f9be4d4e9325fa1aebf7/specs/gloas/p2p-interface.md&quot;&gt;P2P&lt;/a&gt; changes.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/ethereum/consensus-specs/blob/c94138e73e0e70eb4b27f9be4d4e9325fa1aebf7/specs/gloas/validator.md&quot;&gt;Honest validator guide&lt;/a&gt; changes.&lt;/li&gt;
  &lt;li&gt;A new &lt;a href=&quot;https://github.com/ethereum/consensus-specs/blob/c94138e73e0e70eb4b27f9be4d4e9325fa1aebf7/specs/gloas/builder.md&quot;&gt;honest builder&lt;/a&gt; guide.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/ethereum/consensus-specs/blob/c94138e73e0e70eb4b27f9be4d4e9325fa1aebf7/specs/gloas/fork.md&quot;&gt;Fork logic&lt;/a&gt; changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A summary of the main changes is included below, the &lt;a href=&quot;#rationale&quot;&gt;Rationale&lt;/a&gt; section contains an explanation for most of the design decisions around these changes.&lt;/p&gt;

&lt;h4 id=&quot;beacon-chain-changes&quot;&gt;Beacon chain changes&lt;/h4&gt;

&lt;h5 id=&quot;types&quot;&gt;Types&lt;/h5&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;SSZ equivalent&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderIndex&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Builder registry index&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h5 id=&quot;constants&quot;&gt;Constants&lt;/h5&gt;

&lt;h6 id=&quot;index-flags&quot;&gt;Index flags&lt;/h6&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_INDEX_FLAG&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(2**40)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Bitwise flag which indicates that a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ValidatorIndex&lt;/code&gt; should be treated as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderIndex&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h5 id=&quot;domains&quot;&gt;Domains&lt;/h5&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DOMAIN_BEACON_BUILDER&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DomainType(&apos;0x0B000000&apos;)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DOMAIN_PTC_ATTESTER&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DomainType(&apos;0x0C000000&apos;)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DOMAIN_PROPOSER_PREFERENCES&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DomainType(&apos;0x0D000000&apos;)&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h5 id=&quot;misc&quot;&gt;Misc&lt;/h5&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_INDEX_SELF_BUILD&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderIndex(UINT64_MAX)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Value which indicates the proposer built the payload&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_PAYMENT_THRESHOLD_NUMERATOR&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(6)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_PAYMENT_THRESHOLD_DENOMINATOR&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(10)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h5 id=&quot;withdrawal-prefixes&quot;&gt;Withdrawal prefixes&lt;/h5&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_WITHDRAWAL_PREFIX&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bytes1(&apos;0x03&apos;)&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Withdrawal credential prefix for a builder&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h5 id=&quot;preset&quot;&gt;Preset&lt;/h5&gt;

&lt;h6 id=&quot;misc-1&quot;&gt;Misc&lt;/h6&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PTC_SIZE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(2**9)&lt;/code&gt; (= 512)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h6 id=&quot;max-operations-per-block&quot;&gt;Max operations per block&lt;/h6&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_PAYLOAD_ATTESTATIONS&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h6 id=&quot;state-list-lengths&quot;&gt;State list lengths&lt;/h6&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;Unit&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_REGISTRY_LIMIT&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(2**40)&lt;/code&gt; (= 1,099,511,627,776)&lt;/td&gt;
      &lt;td&gt;Builders&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_PENDING_WITHDRAWALS_LIMIT&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(2**20)&lt;/code&gt; (= 1,048,576)&lt;/td&gt;
      &lt;td&gt;Builder pending withdrawals&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h6 id=&quot;withdrawals-processing&quot;&gt;Withdrawals processing&lt;/h6&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_BUILDERS_PER_WITHDRAWALS_SWEEP&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2**14&lt;/code&gt; (= 16,384)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h5 id=&quot;configuration&quot;&gt;Configuration&lt;/h5&gt;

&lt;h6 id=&quot;time-parameters&quot;&gt;Time parameters&lt;/h6&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Unit&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MIN_BUILDER_WITHDRAWABILITY_DELAY&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(2**6)&lt;/code&gt; (= 64)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;epochs&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h5 id=&quot;containers&quot;&gt;Containers&lt;/h5&gt;

&lt;h6 id=&quot;new-containers&quot;&gt;New containers&lt;/h6&gt;

&lt;h6 id=&quot;builder&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Builder&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Builder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pubkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLSPubkey&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint8&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;execution_address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ExecutionAddress&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deposit_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epoch&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;withdrawable_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epoch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;builderpendingpayment&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderPendingPayment&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BuilderPendingPayment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;weight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;withdrawal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BuilderPendingWithdrawal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;builderpendingwithdrawal&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderPendingWithdrawal&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BuilderPendingWithdrawal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fee_recipient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ExecutionAddress&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;amount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;builder_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BuilderIndex&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;payloadattestationdata&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PayloadAttestationData&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PayloadAttestationData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;beacon_block_root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Root&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Slot&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;payload_present&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boolean&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;blob_data_available&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boolean&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;payloadattestation&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PayloadAttestation&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PayloadAttestation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;aggregation_bits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bitvector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PTC_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PayloadAttestationData&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;signature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLSSignature&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;payloadattestationmessage&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PayloadAttestationMessage&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PayloadAttestationMessage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;validator_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ValidatorIndex&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PayloadAttestationData&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;signature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLSSignature&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;indexedpayloadattestation&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IndexedPayloadAttestation&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;IndexedPayloadAttestation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;attesting_indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ValidatorIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PTC_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PayloadAttestationData&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;signature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLSSignature&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;executionpayloadbid&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadBid&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ExecutionPayloadBid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parent_block_hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Hash32&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parent_block_root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Root&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;block_hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Hash32&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;prev_randao&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bytes32&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fee_recipient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ExecutionAddress&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;gas_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint64&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;builder_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BuilderIndex&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Slot&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;execution_payment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;blob_kzg_commitments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;KZGCommitment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_BLOB_COMMITMENTS_PER_BLOCK&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;signedexecutionpayloadbid&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedExecutionPayloadBid&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SignedExecutionPayloadBid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ExecutionPayloadBid&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;signature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLSSignature&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;executionpayloadenvelope&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadEnvelope&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ExecutionPayloadEnvelope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ExecutionPayload&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;execution_requests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ExecutionRequests&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;builder_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BuilderIndex&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;beacon_block_root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Root&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Slot&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;state_root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;signedexecutionpayloadenvelope&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedExecutionPayloadEnvelope&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SignedExecutionPayloadEnvelope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ExecutionPayloadEnvelope&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;signature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLSSignature&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;modified-containers&quot;&gt;Modified containers&lt;/h6&gt;

&lt;h6 id=&quot;beaconblockbody&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconBlockBody&lt;/code&gt;&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: The removed fields (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_payload&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blob_kzg_commitments&lt;/code&gt;, and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_requests&lt;/code&gt;) now exist in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadEnvelope&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BeaconBlockBody&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;randao_reveal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BLSSignature&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;eth1_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Eth1Data&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;graffiti&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bytes32&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;proposer_slashings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ProposerSlashing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_PROPOSER_SLASHINGS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;attester_slashings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AttesterSlashing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_ATTESTER_SLASHINGS_ELECTRA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;attestations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Attestation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_ATTESTATIONS_ELECTRA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deposits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_DEPOSITS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;voluntary_exits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SignedVoluntaryExit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_VOLUNTARY_EXITS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sync_aggregate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SyncAggregate&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [Modified in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Removed `execution_payload`
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;bls_to_execution_changes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SignedBLSToExecutionChange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_BLS_TO_EXECUTION_CHANGES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [Modified in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Removed `blob_kzg_commitments`
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# [Modified in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Removed `execution_requests`
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;signed_execution_payload_bid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SignedExecutionPayloadBid&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;payload_attestations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PayloadAttestation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_PAYLOAD_ATTESTATIONS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h6 id=&quot;beaconstate&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconState&lt;/code&gt;&lt;/h6&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BeaconState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;genesis_time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint64&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;genesis_validators_root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Root&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Slot&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fork&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Fork&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;latest_block_header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BeaconBlockHeader&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;block_roots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Vector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SLOTS_PER_HISTORICAL_ROOT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;state_roots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Vector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SLOTS_PER_HISTORICAL_ROOT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;historical_roots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HISTORICAL_ROOTS_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;eth1_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Eth1Data&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;eth1_data_votes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Eth1Data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EPOCHS_PER_ETH1_VOTING_PERIOD&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SLOTS_PER_EPOCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;eth1_deposit_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint64&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;validators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Validator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VALIDATOR_REGISTRY_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;balances&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VALIDATOR_REGISTRY_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;randao_mixes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Vector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Bytes32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EPOCHS_PER_HISTORICAL_VECTOR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;slashings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Vector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EPOCHS_PER_SLASHINGS_VECTOR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;previous_epoch_participation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ParticipationFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VALIDATOR_REGISTRY_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;current_epoch_participation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ParticipationFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VALIDATOR_REGISTRY_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;justification_bits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bitvector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;JUSTIFICATION_BITS_LENGTH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;previous_justified_checkpoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Checkpoint&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;current_justified_checkpoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Checkpoint&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;finalized_checkpoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Checkpoint&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;inactivity_scores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uint64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VALIDATOR_REGISTRY_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;current_sync_committee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SyncCommittee&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;next_sync_committee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SyncCommittee&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [Modified in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Removed `latest_execution_payload_header`
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;latest_execution_payload_bid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ExecutionPayloadBid&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;next_withdrawal_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WithdrawalIndex&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;next_withdrawal_validator_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ValidatorIndex&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;historical_summaries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HistoricalSummary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HISTORICAL_ROOTS_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deposit_requests_start_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint64&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deposit_balance_to_consume&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;exit_balance_to_consume&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;earliest_exit_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epoch&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;consolidation_balance_to_consume&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;earliest_consolidation_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epoch&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pending_deposits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PendingDeposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PENDING_DEPOSITS_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pending_partial_withdrawals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PendingPartialWithdrawal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PENDING_PARTIAL_WITHDRAWALS_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pending_consolidations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PendingConsolidation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PENDING_CONSOLIDATIONS_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;proposer_lookahead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Vector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ValidatorIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MIN_SEED_LOOKAHEAD&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SLOTS_PER_EPOCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;builders&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Builder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BUILDER_REGISTRY_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;next_withdrawal_builder_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BuilderIndex&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;execution_payload_availability&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bitvector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SLOTS_PER_HISTORICAL_ROOT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;builder_pending_payments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Vector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BuilderPendingPayment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SLOTS_PER_EPOCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;builder_pending_withdrawals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BuilderPendingWithdrawal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BUILDER_PENDING_WITHDRAWALS_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;latest_block_hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Hash32&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [New in Gloas:EIP7732]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;payload_expected_withdrawals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Withdrawal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_WITHDRAWALS_PER_PAYLOAD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconState&lt;/code&gt; container is modified with the addition of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;builders&lt;/code&gt;, of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;List[Builder, BUILDER_REGISTRY_LIMIT]&lt;/code&gt; to track the new in-protocol staked builders.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;next_withdrawal_builder_index&lt;/code&gt; of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderIndex&lt;/code&gt; to help tracking builder withdrawals.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_payload_availability&lt;/code&gt;, of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bitvector[SLOTS_PER_HISTORICAL_ROOT]&lt;/code&gt; to track the presence of execution payloads on the canonical chain.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;builder_pending_payments&lt;/code&gt;, of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Vector[BuilderPendingPayment, 2 * SLOTS_PER_EPOCH]&lt;/code&gt; to track pending payments from builders to proposers before the execution payload has been processed.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;builder_pending_withdrawals&lt;/code&gt;, of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;List[BuilderPendingWithdrawal, BUILDER_PENDING_WITHDRAWALS_LIMIT]&lt;/code&gt; to track pending withdrawals to the execution layer with the builders’ payments.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;latest_block_hash&lt;/code&gt;, of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Hash32&lt;/code&gt;, to track the blockhash of the last execution payload in the blockchain.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;payload_expected_withdrawals&lt;/code&gt; of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD]&lt;/code&gt; to track the latest withdrawals that were deducted in the consensus layer and need to still be honored in the Execution Layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconBlockBody&lt;/code&gt; is modified with the addition of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signed_execution_payload_bid&lt;/code&gt; of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedExecutionPayloadBid&lt;/code&gt; with the builder’s commitment.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;payload_attestations&lt;/code&gt; of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;List[PayloadAttestation, MAX_PAYLOAD_ATTESTATIONS]&lt;/code&gt; a list of PTC attestations from the previous slot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadHeader&lt;/code&gt; object is changed (and renamed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadBid&lt;/code&gt;) to only track the minimum information needed to commit to a builder’s payload.&lt;/p&gt;

&lt;p&gt;State transition logic is modified by:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A new beacon state getter &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_ptc&lt;/code&gt; returns the PTC members for a given slot.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_withdrawals&lt;/code&gt; is modified as follows. Withdrawals are obtained directly from the beacon state instead of the execution payload. They are deducted from the beacon chain. The beacon state &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;latest_withdrawals_root&lt;/code&gt; is updated with the HTR of this list. The next execution payload MUST include withdrawals matching the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state.latest_withdrawals_root&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_execution_payload&lt;/code&gt; is removed from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_block&lt;/code&gt;. Instead a new function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_execution_payload_bid&lt;/code&gt; is included, this function validates the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedExecutionPayloadBid&lt;/code&gt; included in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconBlockBody&lt;/code&gt;, ensures the payment from the builder’s balance can be deducted and adds a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderPendingPayment&lt;/code&gt; object to the beacon state.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_deposit_request&lt;/code&gt; is removed from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_operations&lt;/code&gt; and deferred until &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_execution_payload&lt;/code&gt;. Special care is added for deposit requests from new validator pubkeys, with withdrawal credentials starting with the prefix &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_WITHDRAWAL_PREFIX&lt;/code&gt;. These deposits are immediately added to the beacon chain and processed as new builders.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_withdrawal_request&lt;/code&gt; is removed from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_operations&lt;/code&gt; and deferred until &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_execution_payload&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_consolidation_request&lt;/code&gt; is removed from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_operations&lt;/code&gt; and deferred until &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_execution_payload&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;A new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_payload_attestation&lt;/code&gt; is added to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_operations&lt;/code&gt;, this function validates the payload timeliness attestations broadcast by the PTC members.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_execution_payload&lt;/code&gt; is now called as a separate helper when receiving a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedExecutionPayloadEnvelope&lt;/code&gt; on the P2P layer. This function in particular checks that the HTR of the resulting beacon state coincides with the committed one in the payload envelope. On sucessful processing of the execution payload, the corresponding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderPendingPayment&lt;/code&gt; is removed from the beacon state and a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderPendingWithdrawal&lt;/code&gt; is queued.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Epoch processing is modified by addition of a new helper function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_builder_pending_payments&lt;/code&gt;, that processes the builder pending payments from those payloads that were not included in the canonical chain. 
Although there is no change in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AttestationData&lt;/code&gt; object, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index&lt;/code&gt; field which is unused since the Electra fork, is now repurposed to signal payload availability. The value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; is used when attesting to the current beacon block or a past beacon block without a payload present, and the value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; is used to attest to a past beacon block with a payload present.&lt;/p&gt;

&lt;h4 id=&quot;fork-choice-changes&quot;&gt;Fork-Choice changes&lt;/h4&gt;

&lt;p&gt;Forkchoice is changed substantially to deal with the fact that forkchoice nodes can have different payload content.&lt;/p&gt;

&lt;h4 id=&quot;p2p-changes&quot;&gt;P2P changes&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;A new global topic for broadcasting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedExecutionPayloadBid&lt;/code&gt; messages (builder bids).&lt;/li&gt;
  &lt;li&gt;A new global topic for broadcasting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PayloadAttestationMessage&lt;/code&gt; objects.&lt;/li&gt;
  &lt;li&gt;A new global topic for broadcasting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProposerPreferences&lt;/code&gt; objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;engine-api&quot;&gt;Engine API&lt;/h3&gt;

&lt;p&gt;No changes needed.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;staked-builders&quot;&gt;Staked builders&lt;/h3&gt;

&lt;p&gt;Being a builder is a new type of entity tracked in the beacon state. As such builders are staked in the beacon chain and they have their own withdrawal credential prefix. This allows for in-protocol trustless enforcement of the builder’s payment to the proposer. Alternatively, payment could be enforced in the Execution Layer (EL) at the cost of adding the corresponding EL consensus-changing logic. Payments in the EL have the advantage of not requiring the builder to periodically submit deposit transactions to replenish their validator balance. Both systems require availability of funds before the payload is revealed: in the Consensus Layer (CL) this is done by getting builders to stake. In the EL this is done with a balance check and a payment transaction. This transaction can be checked without executing the payload only if it the first transaction of the block.&lt;/p&gt;

&lt;h3 id=&quot;delayed-validation&quot;&gt;Delayed validation&lt;/h3&gt;

&lt;p&gt;The Payload Timeliness Committee members do not need to validate the execution payload before attesting to it. They perform basic checks such as verifying the builder’s signature, and the correct blockhash is included. This takes away the full execution payload validation from the hot path of validation of an Ethereum block, giving the next proposer 6 seconds (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SECONDS_PER_SLOT * 2 // INTERVALS_PER_SLOT&lt;/code&gt;) to validate the payload and every other validator 9 seconds (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SECONDS_PER_SLOT * 3 // INTERVALS_PER_SLOT&lt;/code&gt;). From a user UX perspective, a transaction included in slot &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;N&lt;/code&gt; by the builder is not widely validated until the proposer of slot &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;N+1&lt;/code&gt; releases their beacon block on top of block &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;N&lt;/code&gt; first and the attesters of slot &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;N+1&lt;/code&gt; vote on this beacon block as the head of the chain.&lt;/p&gt;

&lt;h3 id=&quot;fork-choice&quot;&gt;Fork choice&lt;/h3&gt;

&lt;p&gt;The following features of fork choice are guaranteed under specified margins of security:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Proposer unconditional payment.&lt;/li&gt;
  &lt;li&gt;Builder reveal safety.&lt;/li&gt;
  &lt;li&gt;Builder withhold safety.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Proposer unconditional payment refers to the following. An Ethereum slot can be either:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Full&lt;/em&gt;: both the beacon block and the execution payload have been revealed and included on-chain.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Skipped&lt;/em&gt;: No beacon block (and therefore no execution payload) has been included on-chain for this slot.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Empty&lt;/em&gt;: The beacon block has been included on-chain, but the committed execution payload has not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Proposer unconditional payment refers to the fact that in the third scenario the beacon block proposer received payment from the corresponding builder.&lt;/p&gt;

&lt;p&gt;Builder reveal safety refers to the fact that if the builder acted honestly and revealed a payload in a timely fashion (as attested by the PTC) then the revealed payload will be included on-chain.&lt;/p&gt;

&lt;p&gt;Builder withhold safety refers to the fact that if some beacon block containing a builder’s commitment is withheld and revealed late, the builder will not be charged the value of the bid. In particular, the payload does not even need to be revealed in this case.&lt;/p&gt;

&lt;p&gt;The precise method by which these safety mechanisms are enforced is by allowing attestations to also signal their view of the slot as in either of the above options &lt;em&gt;Full&lt;/em&gt;, &lt;em&gt;Skipped&lt;/em&gt; or &lt;em&gt;Empty&lt;/em&gt;. For this, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index&lt;/code&gt; field in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AttestationData&lt;/code&gt; is used as explained above.&lt;/p&gt;

&lt;h3 id=&quot;ptc-equivocations&quot;&gt;PTC equivocations&lt;/h3&gt;

&lt;p&gt;There is no penalty for PTC nor payload equivocation (that is revealing the right payload and also a withheld message at the same time). A collusion of a builder controlling network partition with a single malicious PTC member could cause a split view by achieving consensus both on payload withheld and a payload present. This could be mitigated by setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PAYLOAD_TIMELY_THRESHOLD&lt;/code&gt; to be 2/3 of the PTC, in which case the malicious operator would have to control at least 33% of the PTC.&lt;/p&gt;

&lt;p&gt;Another mitigation mechanism is to add new slashing conditions for payload equivocation or PTC equivocations (both are signed messages by validators).&lt;/p&gt;

&lt;p&gt;Since this attack results in a split view at a cost for the builder (the payload is revealed and may not be included) this EIP opted for simplicity of implementation.&lt;/p&gt;

&lt;h3 id=&quot;withdrawals&quot;&gt;Withdrawals&lt;/h3&gt;

&lt;p&gt;Withdrawals from the beacon chain are complex in nature, they involve removing funds from one layer and crediting them on another, with different trigger mechanisms that can start from either layer. Before applying the consensus layer state transition function to a given beacon state &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pre_state&lt;/code&gt; and processing a given signed beacon block &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block&lt;/code&gt;, the set of withdrawals that are expected to be deducted from the beacon chain are completely determined by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pre_state&lt;/code&gt;. Previous to this EIP the set of withdrawals that are credited on the execution layer are included in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block&lt;/code&gt;. The block is deemed invalid if these withdrawals do not match. With the separation included in this EIP, these operations of deducting and crediting become asynchronous:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;When processing the beacon block, the withdrawals are deducted from the beacon chain.&lt;/li&gt;
  &lt;li&gt;The set of withdrawals just deducted is committed to the beacon state &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_state&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;When processing any execution payload whose parent beacon state is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_state&lt;/code&gt;, the payload is deemed invalid if it doesn’t include precisely the list of withdrawals committed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post_state&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This asynchronous mechanism has some consequences as slots may be &lt;em&gt;empty&lt;/em&gt; as defined above. In these cases, the consensus layer does not process any more withdrawals until an execution payload has fulfilled the outstanding ones. An alternative design would be to defer all of withdrawal processing to the execution payload validation phase (ie. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_execution_payload&lt;/code&gt;). This has the advantage of not needing to track the fulfilled withdrawals on the beacon chain. The logic changes when several payloads are missing, in which case balances on the beacon chain change and therefore a withdrawal that would be possible with the former mechanism may be different, or even impossible with the latter.&lt;/p&gt;

&lt;h3 id=&quot;three-state-transition-functions&quot;&gt;Three state transition functions&lt;/h3&gt;

&lt;p&gt;The current EIP adds an extra state transition function to the block processing in Ethereum. Processing a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedBeaconBlock&lt;/code&gt; changes the consensus layer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BeaconState&lt;/code&gt;. A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedExecutionPayloadEnvelope&lt;/code&gt; changes both the execution layer state and the consensus layer one. As such, the envelope commits to the consensus layer post-state-transition beacon state root.&lt;/p&gt;

&lt;h3 id=&quot;compatible-designs&quot;&gt;Compatible designs&lt;/h3&gt;

&lt;h4 id=&quot;inclusion-lists&quot;&gt;Inclusion lists&lt;/h4&gt;

&lt;p&gt;This EIP is fully compatible with forkchoice enforced inclusion lists or similar.&lt;/p&gt;

&lt;h4 id=&quot;slot-auctions&quot;&gt;Slot auctions&lt;/h4&gt;

&lt;p&gt;A simple change to this EIP is to remove the blockhash commitment from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SignedExecutionPayloadBid&lt;/code&gt;. This allows the builder to commit any payload to the slot. A preliminary security analysis shows that payload equivocation does not weaken fork choice’s FFG. Some advantages of Slot auctions include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Better user experience as any submitted transaction can be included in the next block (with block auctions a transaction sent in the first half of the slot can only be included in the following block).&lt;/li&gt;
  &lt;li&gt;Longer continuous time to build blocks.&lt;/li&gt;
  &lt;li&gt;Better compatibility designs with fork choice enforced inclusion list proposals.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP introduces backward incompatible changes to the block validation rule set on the consensus layer and must be accompanied by a hard fork.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;h3 id=&quot;free-option-problem&quot;&gt;Free option problem&lt;/h3&gt;

&lt;p&gt;Economically rational but malicious (as defined by the honest builder guide) builders may chose to withhold their payload in the event that it would be profitable for them. This could result in missed slots and degradation of user experience of Ethereum. Some preliminary data in the form of simulation suggests that the number of these occurrences may be noticeable. Some mitigations were proposed in the form of variable penalties for builders that fail to include their payload envelopes in the canonical chain.&lt;/p&gt;

&lt;h3 id=&quot;builder-safety&quot;&gt;Builder safety&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;A colluding set of proposers and attesters controlling consecutive blocks and more than 20% of the total stake can reorg a builder’s payload and force it to pay the bid’s value.&lt;/li&gt;
  &lt;li&gt;There is no possible &lt;em&gt;unbundling&lt;/em&gt; of the builder’s payload in the same slot, that is, if the builder reveals a payload for the head of the chain, no other payload is possible for the current slot.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;malicious-ptc&quot;&gt;Malicious PTC&lt;/h3&gt;

&lt;p&gt;The expected time for a malicious attacker, controlling 35% of the total stake, to have a majority control on the PTC is 205 000 years.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 28 Jun 2024 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7732</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7732</guid>
      </item>
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
      <item>
        <title>Block Gas Accounting without Refunds</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7778 - Block Gas Accounting without Refunds&lt;/strong&gt; is in Last Call status. It is authored by Ben Adams (@benaadams), Toni Wahrstätter (@nerolation) and was originally created 2024-10-01. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7778-prevent-block-gas-smuggling/21234&quot;&gt;https://ethereum-magicians.org/t/eip-7778-prevent-block-gas-smuggling/21234&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP modifies the block gas accounting mechanism to prevent the circumvention of block gas limits. It proposes that gas refunds, particularly those from SSTORE operations setting storage slots to zero, should not reduce the gas counted toward the block gas limit, while still being applied to transaction gas costs for users.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;Currently, gas refunds from operations like clearing storage slots (setting to zero) reduce both the transaction gas cost for users and the gas counted toward the block gas limit. This creates a discrepancy between the computational work performed and the gas accounted for in the block.&lt;/p&gt;

&lt;p&gt;Example: Block &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;20878522&lt;/code&gt; shows a net usage of 28.5 MGas, but contains 4.01 MGas of refunds, bringing the gross usage to 32.51 MGas—exceeding the block gas limit by 2.51 MGas.&lt;/p&gt;

&lt;p&gt;This mechanism can be exploited to perform more operations in a block than the gas limit intends to allow, potentially leading to:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Network instability due to oversized blocks&lt;/li&gt;
  &lt;li&gt;Denial-of-service vectors&lt;/li&gt;
  &lt;li&gt;Computational loads exceeding the intended block gas limit&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;gas-accounting-changes&quot;&gt;Gas Accounting Changes&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;User Gas Accounting (Unchanged):&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Users continue to receive gas refunds for operations that qualify (e.g., setting storage to zero)&lt;/li&gt;
      &lt;li&gt;Transaction gas: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_spent = max(tx_gas_used - gas_refund, calldata_floor_gas_cost)&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Block Gas Accounting (Modified):&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;When calculating gas for block gas limit enforcement, refunds are not subtracted&lt;/li&gt;
      &lt;li&gt;Block gas accounting becomes: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block.gas_used += max(tx_gas_used, calldata_floor_gas_cost)&lt;/code&gt; (incorporating the calldata floor from &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;Storage discounts that reflect actual reduced computational work (e.g., warm storage access, reverting to original values) remain applied to block gas accounting&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;aligning-gas-limits-with-computational-work&quot;&gt;Aligning Gas Limits with Computational Work&lt;/h3&gt;

&lt;p&gt;The block gas limit is designed to constrain the computational load per block. Gas refunds were introduced to incentivize “cleaning up” the state, not to allow exceeding computational limits. By excluding refunds from block gas accounting, we ensure the block gas limit effectively constrains computational load&lt;/p&gt;

&lt;h3 id=&quot;preserving-user-incentives&quot;&gt;Preserving User Incentives&lt;/h3&gt;

&lt;p&gt;Users still receive gas refunds, maintaining incentives for efficient state management. Only the accounting for block-level constraints changes, not the economics for individual users&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;This change is not backwards compatible and requires a hard fork&lt;/li&gt;
  &lt;li&gt;User and developer experience for individual transactions remains unchanged&lt;/li&gt;
  &lt;li&gt;Block producers need to adjust their transaction selection algorithms to account for the new gas accounting rules&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;SSTORE Operations:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Setting storage to zero: User receives refund, but block gas accounting uses full cost&lt;/li&gt;
      &lt;li&gt;Verify blocks containing many storage-clearing operations still adhere to gas limits&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Block Gas Limit Edge Cases:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Construct blocks with varying amounts of refundable operations&lt;/li&gt;
      &lt;li&gt;Ensure blocks cannot exceed gas limits through refund mechanisms&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Transaction Gas vs Block Gas:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Verify that transaction costs for users remain unchanged&lt;/li&gt;
      &lt;li&gt;Confirm block gas accounting properly excludes refunds&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Eliminates potential denial-of-service vectors that exploit gas refunds to exceed block computational limits&lt;/li&gt;
  &lt;li&gt;Improves predictability of block processing times by enforcing stricter limits on computational work&lt;/li&gt;
  &lt;li&gt;Prevents miners/validators from including transactions that collectively contain more computational work than intended&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Tue, 01 Oct 2024 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7778</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7778</guid>
      </item>
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
      <item>
        <title>SLOTNUM opcode</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7843 - SLOTNUM opcode&lt;/strong&gt; is in Last Call status. It is authored by Marc Harvey-Hill (@Marchhill) and was originally created 2024-12-06. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7843-slotnum-opcode/22234&quot;&gt;https://ethereum-magicians.org/t/eip-7843-slotnum-opcode/22234&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP proposes to add a new opcode &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOTNUM&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x4b&lt;/code&gt;), that returns the corresponding slot number for the current block.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;There are currently two ways to get the current slot number onchain:&lt;/p&gt;

&lt;p&gt;1) Calculate from the block timestamp. This requires hardcoding the chain slot length into a smart contract.&lt;/p&gt;

&lt;p&gt;2) Provide the slot number as calldata and prove it against the beacon block root (using &lt;a href=&quot;/EIPS/eip-4788&quot;&gt;EIP-4788&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Both of these approaches have significant drawbacks. (1) would break contracts in the event of a change to the slot length. (2) is expensive in terms of gas, encouraging approach (1) to be used instead.&lt;/p&gt;

&lt;p&gt;A better approach is for the slot length to be abstracted away from applications, and instead the slot number can be calculated in the consensus layer client and exposed by an opcode. This paves the way for future changes to the slot length.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;A new opcode &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOTNUM&lt;/code&gt; is introduced at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x4b&lt;/code&gt;. It shall return one stack element.&lt;/p&gt;

&lt;h3 id=&quot;output&quot;&gt;Output&lt;/h3&gt;

&lt;p&gt;One element &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slotNumber&lt;/code&gt; is added to the stack; it is equal to the corresponding slot number for this block. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slotNumber&lt;/code&gt; is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64&lt;/code&gt; in big endian encoding.&lt;/p&gt;

&lt;h3 id=&quot;gas-cost&quot;&gt;Gas Cost&lt;/h3&gt;

&lt;p&gt;The gas cost for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOTNUM&lt;/code&gt; is a fixed fee of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;rpc-changes&quot;&gt;RPC changes&lt;/h3&gt;

&lt;p&gt;The slot number is calculated in the consensus layer and passed to the execution layer through the engine API.&lt;/p&gt;

&lt;h4 id=&quot;header-extension&quot;&gt;Header extension&lt;/h4&gt;

&lt;p&gt;The header encoding shall be extended to include a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slotNumber&lt;/code&gt; field of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;engine-api-changes&quot;&gt;Engine API changes&lt;/h4&gt;

&lt;p&gt;New objects &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadV4&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PayloadAttributesV4&lt;/code&gt; are introduced, adding a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slotNumber&lt;/code&gt; field of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64&lt;/code&gt;. The methods &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_newPayloadV5&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_getPayloadV6&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_forkchoiceUpdatedV4&lt;/code&gt; are added, to use the new objects.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;gas-price&quot;&gt;Gas Price&lt;/h3&gt;

&lt;p&gt;The opcode is priced to match similar opcodes in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;W_base&lt;/code&gt; set.&lt;/p&gt;

&lt;h3 id=&quot;calculation-in-consensus-layer&quot;&gt;Calculation in consensus layer&lt;/h3&gt;

&lt;p&gt;The slot number could alternatively be calculated in the execution layer using the timestamp, but it is more appropriate to calculate values pertaining to the beacon chain in the consensus layer. Additionally this avoids code duplication, as the slot number is already calculated in the consensus layer.&lt;/p&gt;

&lt;h3 id=&quot;zk-vm-proving&quot;&gt;ZK-VM proving&lt;/h3&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOTNUM&lt;/code&gt; opcode should not increase the complexity of proving EVM execution, as it is similar to existing opcodes such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TIMESTAMP&lt;/code&gt;. The slot number is included in the block header rather than as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_newPayload&lt;/code&gt; parameter, ensuring that the block is self-contained for proving; no extra inputs to the circuit are required.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;No backward compatibility issues found.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;p&gt;N/A&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;None.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 06 Dec 2024 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7843</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7843</guid>
      </item>
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
      <item>
        <title>Compute Gas Cost Analysis</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7904 - Compute Gas Cost Analysis&lt;/strong&gt; is in Last Call status. It is authored by Jacek Glen (@JacekGlen), Lukasz Glen (@lukasz-glen), Maria Silva (@misilva73) and was originally created 2025-02-05. It is in the  category of type Informational. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/gas-cost-repricing-to-reflect-computational-complexity/23067&quot;&gt;https://ethereum-magicians.org/t/gas-cost-repricing-to-reflect-computational-complexity/23067&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This document reports an empirical analysis of the runtime of EVM compute operations and precompiles across the major execution clients. Measurements were taken on clients that include the parallel-execution optimizations enabled by &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; (Block-Level Access Lists). Using a target throughput of &lt;strong&gt;100 million gas per second (Mgas/s)&lt;/strong&gt;, the analysis finds that every compute operation and precompile examined already performs at or above that target under the current gas schedule. We therefore conclude that no compute operation or precompile requires a gas-cost increase, and this EIP recommends no changes to the gas schedule.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;Earlier revisions of this proposal were Standards Track and aimed to &lt;em&gt;raise&lt;/em&gt; the gas cost of a set of compute operations and precompiles that empirical measurement had shown performing below the target throughput. The intent was to remove these operations as bottlenecks so that the block gas limit could be raised safely.&lt;/p&gt;

&lt;p&gt;Since those measurements were taken, the client-side optimizations unlocked by Block-Level Access Lists (&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;) — parallel disk reads, parallel transaction validation, and executionless state updates — have stabilized across all major execution clients. Re-running the benchmark and estimation pipeline against clients with these optimizations in place changes the picture entirely: the operations that previously appeared underpriced now clear the 100 Mgas/s target comfortably at their current gas costs.&lt;/p&gt;

&lt;p&gt;Because the original motivation for repricing no longer holds, this EIP is recorded as Informational. Its purpose is to document the analysis, preserve the methodology and data for future repricing work, and state the conclusion that no compute gas cost needs to change.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;This EIP specifies &lt;strong&gt;no changes&lt;/strong&gt; to the Ethereum gas schedule. No opcode or precompile gas cost is modified.&lt;/p&gt;

&lt;p&gt;The analysis examined the 18 gas parameters listed below — the opcodes and precompiles that earlier revisions had flagged as candidates for repricing. For each parameter, the table reports the current gas cost against the gas cost implied by the worst-performing client at the 100 Mgas/s target. A proposed value at or below the current value means the operation already meets the throughput target at its current price.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Gas param&lt;/th&gt;
      &lt;th&gt;Current gas&lt;/th&gt;
      &lt;th&gt;Measured at 100 Mgas/s&lt;/th&gt;
      &lt;th&gt;Diff&lt;/th&gt;
      &lt;th&gt;Diff %&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;OPCODE_DIV&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;-3&lt;/td&gt;
      &lt;td&gt;-60%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OPCODE_SDIV&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;-3&lt;/td&gt;
      &lt;td&gt;-60%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OPCODE_MOD&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;-3&lt;/td&gt;
      &lt;td&gt;-60%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OPCODE_SMOD&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;-2&lt;/td&gt;
      &lt;td&gt;-40%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OPCODE_ADDMOD&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;-5&lt;/td&gt;
      &lt;td&gt;-62%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OPCODE_MULMOD&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;-4&lt;/td&gt;
      &lt;td&gt;-50%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OPCODE_KECCAK256_BASE&lt;/td&gt;
      &lt;td&gt;30&lt;/td&gt;
      &lt;td&gt;12&lt;/td&gt;
      &lt;td&gt;-18&lt;/td&gt;
      &lt;td&gt;-60%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OPCODE_KECCAK256_PER_WORD&lt;/td&gt;
      &lt;td&gt;6&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;-3&lt;/td&gt;
      &lt;td&gt;-50%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_ECRECOVER&lt;/td&gt;
      &lt;td&gt;3000&lt;/td&gt;
      &lt;td&gt;841&lt;/td&gt;
      &lt;td&gt;-2159&lt;/td&gt;
      &lt;td&gt;-72%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_BLAKE2F_BASE&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;94&lt;/td&gt;
      &lt;td&gt;+94&lt;/td&gt;
      &lt;td&gt;n/a&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_BLAKE2F_PER_ROUND&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;0%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_BLS_G1ADD&lt;/td&gt;
      &lt;td&gt;375&lt;/td&gt;
      &lt;td&gt;236&lt;/td&gt;
      &lt;td&gt;-139&lt;/td&gt;
      &lt;td&gt;-37%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_BLS_G2ADD&lt;/td&gt;
      &lt;td&gt;600&lt;/td&gt;
      &lt;td&gt;277&lt;/td&gt;
      &lt;td&gt;-323&lt;/td&gt;
      &lt;td&gt;-54%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_ECADD&lt;/td&gt;
      &lt;td&gt;150&lt;/td&gt;
      &lt;td&gt;108&lt;/td&gt;
      &lt;td&gt;-42&lt;/td&gt;
      &lt;td&gt;-28%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_ECPAIRING_BASE&lt;/td&gt;
      &lt;td&gt;45000&lt;/td&gt;
      &lt;td&gt;8247&lt;/td&gt;
      &lt;td&gt;-36753&lt;/td&gt;
      &lt;td&gt;-82%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_ECPAIRING_PER_POINT&lt;/td&gt;
      &lt;td&gt;34000&lt;/td&gt;
      &lt;td&gt;11712&lt;/td&gt;
      &lt;td&gt;-22288&lt;/td&gt;
      &lt;td&gt;-66%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_POINT_EVALUATION&lt;/td&gt;
      &lt;td&gt;50000&lt;/td&gt;
      &lt;td&gt;23825&lt;/td&gt;
      &lt;td&gt;-26175&lt;/td&gt;
      &lt;td&gt;-52%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PRECOMPILE_P256VERIFY&lt;/td&gt;
      &lt;td&gt;6900&lt;/td&gt;
      &lt;td&gt;3814&lt;/td&gt;
      &lt;td&gt;-3086&lt;/td&gt;
      &lt;td&gt;-45%&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Sixteen of the eighteen parameters measure cheaper than the current schedule, and one (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PRECOMPILE_BLAKE2F_PER_ROUND&lt;/code&gt;) is unchanged. The only parameter that measures higher than the current schedule is the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BLAKE2F&lt;/code&gt; base cost, which is currently unpriced (0 gas); the measured value of 94 gas is negligible relative to typical block gas usage and does not constitute a throughput bottleneck. On this basis, no operation is underpriced to a degree that warrants a gas-cost increase.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;/assets/eip-7904/analysis/2026-06-10/new_gas_proposal&quot;&gt;full proposal report&lt;/a&gt;, including per-client breakdowns and worst-case provenance, accompanies this EIP.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;empirical-estimation-of-gas-costs&quot;&gt;Empirical Estimation of Gas Costs&lt;/h3&gt;

&lt;h4 id=&quot;target-throughput&quot;&gt;Target Throughput&lt;/h4&gt;

&lt;p&gt;A performance target of &lt;strong&gt;100 million gas per second&lt;/strong&gt; is used as the anchor for the analysis. This target reflects the throughput that the optimized clients are expected to sustain, a substantial increase over the historical baseline. An operation is considered adequately priced if its measured runtime at the current gas cost meets or exceeds this rate.&lt;/p&gt;

&lt;h4 id=&quot;data-collection&quot;&gt;Data Collection&lt;/h4&gt;

&lt;p&gt;The estimates are based on the actual time each operation takes to run on the various execution clients. Similar to the methodology used in the Gas Cost Estimator project, we generate synthetic blocks that isolate and stress individual EVM operations.&lt;/p&gt;

&lt;p&gt;Concretely, to benchmark a single operation, different blocks are created by varying the number of times the target operation is executed and by changing the parameter values to the operation. The EEST benchmark suite contains the tests used to generate these blocks.&lt;/p&gt;

&lt;p&gt;Then, the Benchmarkoor tool is used to collect the needed metrics. This tool returns the total execution time of the block and the number of times each operation was executed. Each test block is run multiple times on each client to account for variability in execution time. The clients measured in the latest run are Besu, Erigon, ethrex, Geth, Nethermind, and Reth.&lt;/p&gt;

&lt;h5 id=&quot;what-about-dynamic-costs&quot;&gt;What about dynamic costs?&lt;/h5&gt;

&lt;p&gt;Some operations have a dynamic component to their costs. For example, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KECCAK256&lt;/code&gt; opcode has a gas cost that grows with the size of the input. In these cases, the test benchmarks the operation with a range of inputs to assess how the resource costs vary with different inputs.&lt;/p&gt;

&lt;h5 id=&quot;what-about-differences-between-client-implementations&quot;&gt;What about differences between client implementations?&lt;/h5&gt;

&lt;p&gt;Ultimately, we require a single cost model that is independent of the client’s implementation. Although the decision may be different in a specific situation, the general rule is to take the worst client result that cannot be optimized. This means that the worst-performing client on a given operation and resource combination defines the cost of that operation for the entire network. This is the safer and most conservative choice, and it is the value reported in the table above.&lt;/p&gt;

&lt;h4 id=&quot;runtime-estimation&quot;&gt;Runtime Estimation&lt;/h4&gt;

&lt;p&gt;To estimate the runtime of a single operation from the total execution time of the corresponding synthetic blocks, a &lt;strong&gt;Non-Negative Least Squares (NNLS) Linear Regression&lt;/strong&gt; is used. This model enforces that all coefficients are non-negative, thus ensuring execution time cannot be negative. The model estimates runtime as a linear combination of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Constant term (intercept)&lt;/strong&gt;: Base overhead for executing the test, which includes setup and teardown time&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Operation count (slope)&lt;/strong&gt;: Number of times the operation is executed in the test. This parameter is the one that allows us to estimate the per-operation runtime.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Operation-specific parameters&lt;/strong&gt;: Variables like number of rounds, message size, or number of pairs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For simple operations (i.e., without additional parameters), the model estimates: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime = intercept + slope × operation_count&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For variable operations, the model estimates: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime = intercept + slope × operation_count + param1_coef × operation_count × param1 + param2_coef × operation_count × param2 + ...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Independent models are created for each client and operation. Only operations and parameters with good model fits (R² &amp;gt; 0.5 and p-value &amp;lt; 0.05) are relied upon for the conclusion, to ensure the reliability of the estimates.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;/assets/eip-7904/analysis/2026-06-10/runtime_estimation_autogenerated_report&quot;&gt;model-performance report&lt;/a&gt; breaks down the fit by operation and client, while the &lt;a href=&quot;/assets/eip-7904/analysis/2026-06-10/results.csv&quot;&gt;key model outputs&lt;/a&gt; are available as a CSV.&lt;/p&gt;

&lt;h4 id=&quot;conversion-to-gas-costs&quot;&gt;Conversion to gas costs&lt;/h4&gt;

&lt;p&gt;The measured gas costs in the table are calculated using the target performance of 100 Mgas/s. The formula used is:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gas = (anchor_rate * runtime_ms) / 1000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime_ms&lt;/code&gt; is the estimated runtime in milliseconds from the regression models and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;anchor_rate&lt;/code&gt; is 100 Mgas/s.&lt;/p&gt;

&lt;p&gt;The full details of this step are in the &lt;a href=&quot;/assets/eip-7904/analysis/2026-06-10/new_gas_proposal&quot;&gt;proposal report&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;other-projects&quot;&gt;Other Projects&lt;/h3&gt;

&lt;p&gt;Several initiatives have explored the real gas costs of EVM operations, providing valuable context for this analysis. Notable examples include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;a href=&quot;/assets/eip-7904/gas-cost-estimator-report.pdf&quot;&gt;Gas Cost Estimator&lt;/a&gt; project did a similar empirical analysis. It conducted extensive testing across seven widely-used EVM implementations to measure the actual computational effort required by various opcodes and operations. Conducted in a controlled environment to eliminate external variables, the tests produced accurate and reproducible results. The findings highlight the relationship between the current gas cost schedule and the real-world computational complexity of EVM operations.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/EIPS/eip-7883&quot;&gt;EIP-7883&lt;/a&gt; - ModExp Gas Cost Increase: This EIP specifically analyzed ModExp and proposed a revised pricing scheme, consistent with the measuring approach used here.&lt;/li&gt;
  &lt;li&gt;Nethermind’s Gas Benchmarks: This project takes a different approach to measuring gas costs. It uses standalone clients rather than isolated EVM implementations. Despite the methodological difference, its results mirror those of the Gas Cost Estimator, reinforcing our conclusions.&lt;/li&gt;
  &lt;li&gt;EVM Memory Analysis by @raxhvl: This project focuses on memory-related costs, providing valuable insights into the memory access and expansion costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These projects collectively provide context for reassessing gas costs and demonstrate broad alignment with our measurements.&lt;/p&gt;

&lt;h3 id=&quot;interaction-with-eip-7928&quot;&gt;Interaction with &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; introduces Block-Level Access Lists, which enable parallel disk reads, parallel transaction validation, and executionless state updates through client optimizations. The latest benchmarks were run on clients that have these optimizations implemented and stabilized. This is the central reason the analysis reaches a no-repricing conclusion: with the optimizations in place, the compute operations previously identified as bottlenecks now clear the target throughput at their current gas costs.&lt;/p&gt;

&lt;h3 id=&quot;computational-complexity-only&quot;&gt;Computational Complexity Only&lt;/h3&gt;

&lt;p&gt;This analysis intentionally focuses on computational complexity—measured as execution time on a bare CPU — while excluding network-related costs like state persistency. This ensures the findings remain implementation-agnostic, applicable across diverse EVM clients regardless of their technological stack. By leveraging empirical data from multiple EVM implementations, we establish a universal, verifiable benchmark for computational effort. This focus simplifies estimation and enhances the analysis’s clarity and applicability within Ethereum’s varied ecosystem.&lt;/p&gt;

&lt;h3 id=&quot;why-no-repricing-is-recommended&quot;&gt;Why No Repricing Is Recommended&lt;/h3&gt;

&lt;p&gt;The original proposal adopted a conservative strategy: prioritize gas increases only for operations that empirical data showed as underpriced, so that the base throughput of the chain could be raised without changing the costs of the majority of operations. Applying that same standard to the latest data yields no candidates for repricing — the measured runtimes of all examined operations are consistent with, or cheaper than, their current gas costs at the 100 Mgas/s target. Lowering gas costs is out of scope for this analysis, which was concerned only with identifying and removing underpriced bottlenecks. Consequently, the gas schedule is left unchanged.&lt;/p&gt;

&lt;h3 id=&quot;consideration-of-zk-snark-proof-generation&quot;&gt;Consideration of ZK-SNARK Proof Generation&lt;/h3&gt;

&lt;p&gt;This analysis focuses on general computational complexity, using a bare CPU as the reference point. Therefore, it does not specifically address the unique demands of ZK-SNARK proof generation. Since the analysis recommends no gas-cost changes, it has no effect on proving times for EVM blocks.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;This is an Informational EIP that recommends no changes to the Ethereum protocol or gas schedule. It introduces no consensus changes and therefore no direct security implications.&lt;/p&gt;

&lt;p&gt;The analysis itself is conservative: it relies on the worst-performing client for each operation and only draws conclusions from regression models with good statistical fits. Should client performance characteristics change in the future — for example, if an optimization is reverted or a new operation is introduced — the analysis should be re-run before relying on its conclusion that the current compute gas costs are adequate.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7904</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7904</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>Block-Level Access Lists</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7928 - Block-Level Access Lists&lt;/strong&gt; is in Last Call status. It is authored by Toni Wahrstätter (@nerolation), Dankrad Feist (@dankrad), Francesco D`Amato (@fradamt), Jochem Brouwer (@jochem-brouwer), Ignacio Hagopian (@jsign), Felipe Selmo (@fselmo), Rahul (@raxhvl), Stefan (@qu0b) and was originally created 2025-03-31. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7928-block-level-access-lists/23337&quot;&gt;https://ethereum-magicians.org/t/eip-7928-block-level-access-lists/23337&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP introduces Block-Level Access Lists (BALs) that record all accounts and storage locations accessed during block execution, along with their post-execution values. BALs enable parallel disk reads, parallel transaction validation, parallel state root computation and executionless state updates.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;Transaction execution cannot be parallelized without knowing in advance which addresses and storage slots will be accessed. While &lt;a href=&quot;/EIPS/eip-2930&quot;&gt;EIP-2930&lt;/a&gt; introduced optional transaction access lists, they are not enforced.&lt;/p&gt;

&lt;p&gt;This proposal enforces access lists at the block level, enabling:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Parallel disk reads and transaction execution&lt;/li&gt;
  &lt;li&gt;Parallel post-state root calculation&lt;/li&gt;
  &lt;li&gt;State reconstruction without executing transactions&lt;/li&gt;
  &lt;li&gt;Reduced execution time to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;parallel IO + parallel EVM&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;block-structure-modification&quot;&gt;Block Structure Modification&lt;/h3&gt;

&lt;p&gt;We introduce a new field to the block header, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_access_list_hash&lt;/code&gt;, which contains the Keccak-256 hash of the RLP-encoded block access list. For an empty block access list, this is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keccak256(rlp.encode([])) = 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Existing fields
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
    
    &lt;span class=&quot;n&quot;&gt;block_access_list_hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Hash32&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keccak256&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rlp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_access_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockAccessList&lt;/code&gt; is not included in the block body. The EL stores BALs separately and transmits them as a field in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayload&lt;/code&gt; via the engine API. The BAL is RLP-encoded as a list of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AccountChanges&lt;/code&gt;. An empty block access list encodes as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xc0&lt;/code&gt;, i.e. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rlp.encode([])&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;rlp-data-structures&quot;&gt;RLP Data Structures&lt;/h3&gt;

&lt;p&gt;BALs use RLP encoding following the pattern: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;address -&amp;gt; field -&amp;gt; block_access_index -&amp;gt; change&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Type aliases for RLP encoding
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Address&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bytes20&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 20-byte Ethereum address
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StorageKey&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint256&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Storage slot key
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StorageValue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint256&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Storage value
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Bytecode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;bytes&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Variable-length contract bytecode
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BlockAccessIndex&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint32&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Block access index (0 for pre-execution, 1..n for transactions, n+1 for post-execution)
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Balance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint256&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Post-transaction balance in wei
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Nonce&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint64&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Account nonce
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Core change structures (RLP encoded as lists)
# StorageChange: [block_access_index, new_value]
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StorageChange&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BlockAccessIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;StorageValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# BalanceChange: [block_access_index, post_balance]
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BalanceChange&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BlockAccessIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# NonceChange: [block_access_index, new_nonce]
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NonceChange&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BlockAccessIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Nonce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# CodeChange: [block_access_index, new_code]
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CodeChange&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BlockAccessIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bytecode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# SlotChanges: [slot, [changes]]
# All changes to a single storage slot
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SlotChanges&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StorageKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StorageChange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# AccountChanges: [address, storage_changes, storage_reads, balance_changes, nonce_changes, code_changes]
# All changes for a single account, grouped by field type
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AccountChanges&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;                    &lt;span class=&quot;c1&quot;&gt;# address
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SlotChanges&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# storage_changes (slot -&amp;gt; [block_access_index -&amp;gt; new_value])
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StorageKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;           &lt;span class=&quot;c1&quot;&gt;# storage_reads (read-only storage keys)
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BalanceChange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# balance_changes ([block_access_index -&amp;gt; post_balance])
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NonceChange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# nonce_changes ([block_access_index -&amp;gt; new_nonce])
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CodeChange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;            &lt;span class=&quot;c1&quot;&gt;# code_changes ([block_access_index -&amp;gt; new_code])
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# BlockAccessList: List of AccountChanges
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BlockAccessList&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AccountChanges&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;scope-and-inclusion&quot;&gt;Scope and Inclusion&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockAccessList&lt;/code&gt;&lt;/strong&gt; is the set of all addresses accessed during block execution.&lt;/p&gt;

&lt;p&gt;It MUST include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Addresses with state changes (storage, balance, nonce, or code).&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Addresses accessed without state changes, including:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Targets of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BALANCE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODEHASH&lt;/code&gt; opcodes&lt;/li&gt;
      &lt;li&gt;Targets of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALLCODE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DELEGATECALL&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATICCALL&lt;/code&gt; (even if they revert; see &lt;a href=&quot;#gas-validation-before-state-access&quot;&gt;Gas Validation Before State Access&lt;/a&gt; for inclusion conditions)&lt;/li&gt;
      &lt;li&gt;Target addresses of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; only once the EVM accesses the computed address: on post-access out-of-gas, on creation collision, or when creation setup increments the new account’s nonce; not on address computation alone, nor when creation fails before access (e.g. insufficient sender balance for the endowment, nonce overflow, or call stack depth limit)&lt;/li&gt;
      &lt;li&gt;Deployed contract addresses from creation transactions, i.e. transactions with an empty &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;to&lt;/code&gt; field, which are always included since the deployment address is unconditionally accessed during transaction setup&lt;/li&gt;
      &lt;li&gt;Transaction sender and recipient addresses (even for zero-value transfers), unless the transaction halts before the recipient is loaded (see &lt;strong&gt;Exceptional halts&lt;/strong&gt;)&lt;/li&gt;
      &lt;li&gt;Beneficiary addresses for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;System contract addresses accessed during pre/post-execution; the system caller address, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYSTEM_ADDRESS&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xfffffffffffffffffffffffffffffffffffffffe&lt;/code&gt;), MUST NOT be included unless it experiences state access itself&lt;/li&gt;
      &lt;li&gt;Withdrawal recipient addresses, regardless of whether the withdrawal amount is non-zero&lt;/li&gt;
      &lt;li&gt;Precompiled contracts when called or accessed&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Addresses with no state changes MUST still be present with empty change lists.&lt;/p&gt;

&lt;p&gt;Entries from an &lt;a href=&quot;/EIPS/eip-2930&quot;&gt;EIP-2930&lt;/a&gt; access list MUST NOT be included automatically. Only addresses and storage slots that are actually touched or changed during execution are recorded.&lt;/p&gt;

&lt;h3 id=&quot;block-access-list-size-constraint&quot;&gt;Block Access List Size Constraint&lt;/h3&gt;

&lt;p&gt;The block access list is constrained by the block gas limit rather than a fixed maximum number of items. The constraint is defined as:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bal_items &amp;lt;= block_gas_limit // ITEM_COST
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bal_items = storage_keys + addresses&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ITEM_COST = 2000&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_keys&lt;/code&gt; is the total number of storage keys across all accounts, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;addresses&lt;/code&gt; is the total number of unique addresses accessed in the block. With &lt;a href=&quot;/EIPS/eip-7981&quot;&gt;EIP-7981&lt;/a&gt;, the cheapest way to add an item to the BAL is a cold &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOAD&lt;/code&gt; at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_SLOAD_COST&lt;/code&gt; (2100, as defined in &lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt;). &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ITEM_COST&lt;/code&gt; is set deliberately below this minimum to create a buffer of approximately &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_gas_limit / 42000&lt;/code&gt; extra items, which absorbs BAL entries from system contract execution (e.g., &lt;a href=&quot;/EIPS/eip-2935&quot;&gt;EIP-2935&lt;/a&gt;, &lt;a href=&quot;/EIPS/eip-4788&quot;&gt;EIP-4788&lt;/a&gt;, &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt;, &lt;a href=&quot;/EIPS/eip-7251&quot;&gt;EIP-7251&lt;/a&gt;) and withdrawal recipients (&lt;a href=&quot;/EIPS/eip-4895&quot;&gt;EIP-4895&lt;/a&gt;) that do not consume block gas.&lt;/p&gt;

&lt;h3 id=&quot;gas-validation-before-state-access&quot;&gt;Gas Validation Before State Access&lt;/h3&gt;

&lt;p&gt;State-accessing opcodes perform gas validation in two phases:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Pre-state validation&lt;/strong&gt;: Gas costs determinable without state access (memory expansion, base opcode cost, warm/cold access cost)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Post-state validation&lt;/strong&gt;: Gas costs requiring state access (account existence, &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; delegation resolution)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pre-state validation MUST pass before any state access occurs. If pre-state validation fails, the target resource (address or storage slot) is never accessed and MUST NOT be included in the BAL.&lt;/p&gt;

&lt;p&gt;Once pre-state validation passes, the target is accessed and included in the BAL. Post-state costs are then calculated; their order is implementation-defined since the target has already been accessed.&lt;/p&gt;

&lt;p&gt;The following table specifies pre-state validation costs in addition to the base opcode cost (gas constants as defined in &lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt;):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Instruction&lt;/th&gt;
      &lt;th&gt;Pre-state Validation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BALANCE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFBALANCE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;None (accesses current contract, always warm)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODEHASH&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory_expansion&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_COPY&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory_expansion&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CALL_VALUE&lt;/code&gt; (if value &amp;gt; 0)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALLCODE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory_expansion&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CALL_VALUE&lt;/code&gt; (if value &amp;gt; 0)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DELEGATECALL&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory_expansion&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATICCALL&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory_expansion&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory_expansion&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INITCODE_WORD_COST&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory_expansion&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INITCODE_WORD_COST&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_KECCAK256_WORD&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOAD&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt;, and more than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CALL_STIPEND&lt;/code&gt; available&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_SELF_DESTRUCT&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt;: For account-accessing opcodes, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS_COST&lt;/code&gt; if cold and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_STORAGE_READ_COST&lt;/code&gt; if warm, except for a warm &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; beneficiary, which has zero access cost as specified by &lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt;. For storage-accessing opcodes (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOAD&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_SLOAD_COST&lt;/code&gt; if cold and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_STORAGE_READ_COST&lt;/code&gt; if warm.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory_expansion&lt;/code&gt;: Gas cost to expand memory for input/output regions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Post-state costs (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; for calls to empty accounts, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_SELF_DESTRUCT_NEW_ACCOUNT&lt;/code&gt; if beneficiary does not exist) do not affect BAL inclusion since the target has already been accessed.&lt;/p&gt;

&lt;h4 id=&quot;eip-7702-delegation&quot;&gt;EIP-7702 Delegation&lt;/h4&gt;

&lt;p&gt;When a call target has an &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; delegation, the target is accessed to resolve the delegation, which also accesses the delegated address. The delegated address requires its own &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt; check before being accessed; if that gas check fails, the delegated address MUST NOT appear in the BAL. Otherwise both the original call target and the delegated address MUST appear in the BAL, including when the call subsequently fails its sender-balance (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sender_balance &amp;gt;= value&lt;/code&gt;) or call-stack-depth check, since the delegation is resolved before those checks.&lt;/p&gt;

&lt;p&gt;Note: Delegated accounts cannot be empty, so &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; never applies when resolving delegations.&lt;/p&gt;

&lt;h4 id=&quot;sstore&quot;&gt;SSTORE&lt;/h4&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; performs an implicit read of the current storage value for gas calculation. Before this read, the frame MUST cover the storage slot’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_cost&lt;/code&gt; and MUST also satisfy the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CALL_STIPEND&lt;/code&gt; sentry (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left &amp;gt; GAS_CALL_STIPEND&lt;/code&gt;); because the access cost can exceed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CALL_STIPEND&lt;/code&gt; after repricing, the stipend sentry alone is no longer sufficient. If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; fails this check, the storage slot MUST NOT appear in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_reads&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_changes&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;ordering-uniqueness-and-determinism&quot;&gt;Ordering, Uniqueness and Determinism&lt;/h3&gt;

&lt;p&gt;The following ordering rules MUST apply:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Accounts&lt;/strong&gt;: Lexicographic by address&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;storage_changes&lt;/strong&gt;: Slots by storage key value (ascending); within each slot, changes by block access index (ascending)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;storage_reads&lt;/strong&gt;: By storage key value (ascending)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;balance_changes, nonce_changes, code_changes&lt;/strong&gt;: By block access index (ascending)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following uniqueness constraints MUST hold:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Each address MUST appear exactly once in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockAccessList&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Each storage key MUST appear at most once in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_changes&lt;/code&gt; per account.&lt;/li&gt;
  &lt;li&gt;Each storage key MUST appear at most once in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_reads&lt;/code&gt; per account.&lt;/li&gt;
  &lt;li&gt;A storage key MUST NOT appear in both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_changes&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_reads&lt;/code&gt; for the same account.&lt;/li&gt;
  &lt;li&gt;Each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_access_index&lt;/code&gt; MUST appear at most once per change list (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;balance_changes&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nonce_changes&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code_changes&lt;/code&gt;, and per-slot &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StorageChange&lt;/code&gt; list).&lt;/li&gt;
  &lt;li&gt;Each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SlotChanges&lt;/code&gt; entry MUST contain at least one &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StorageChange&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;blockaccessindex-assignment&quot;&gt;BlockAccessIndex Assignment&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockAccessIndex&lt;/code&gt; values MUST be assigned as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; for &lt;strong&gt;pre‑execution&lt;/strong&gt; system contract calls.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1 … n&lt;/code&gt; for transactions (in block order).&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n + 1&lt;/code&gt; for &lt;strong&gt;post‑execution&lt;/strong&gt; system contract calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;recording-semantics-by-change-type&quot;&gt;Recording Semantics by Change Type&lt;/h3&gt;

&lt;h4 id=&quot;storage&quot;&gt;Storage&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Writes include:&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Any value change (post‑value ≠ pre‑value).&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Zeroing&lt;/strong&gt; a slot (pre‑value exists, post‑value is zero).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Reads include:&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Slots accessed via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOAD&lt;/code&gt; that are not written.&lt;/li&gt;
      &lt;li&gt;Slots written with unchanged values (i.e., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; where post-value equals pre-value, also known as “no-op writes”).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: Implementations MUST compare each write against the storage value as of immediately before the current &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_access_index&lt;/code&gt; (i.e., the cumulative state from all prior indices, falling back to the pre-block state) to correctly distinguish between actual writes and no-op writes. A no-op write MUST NOT remove &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_changes&lt;/code&gt; entries from earlier indices for the same slot.&lt;/p&gt;

&lt;h4 id=&quot;balance-balance_changes&quot;&gt;Balance (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;balance_changes&lt;/code&gt;)&lt;/h4&gt;

&lt;p&gt;Record &lt;strong&gt;post‑transaction&lt;/strong&gt; balances (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint256&lt;/code&gt;) for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Transaction &lt;strong&gt;senders&lt;/strong&gt; (gas + value).&lt;/li&gt;
  &lt;li&gt;Transaction &lt;strong&gt;recipients&lt;/strong&gt; (only if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;value &amp;gt; 0&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;CALL/CALLCODE &lt;strong&gt;senders&lt;/strong&gt; (value).&lt;/li&gt;
  &lt;li&gt;CALL/CALLCODE &lt;strong&gt;recipients&lt;/strong&gt; (only if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;value &amp;gt; 0&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;CREATE/CREATE2 recipients (only if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;value &amp;gt; 0&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;COINBASE&lt;/strong&gt; (rewards + fees).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SELFDESTRUCT/SENDALL&lt;/strong&gt; beneficiaries.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Withdrawal recipients&lt;/strong&gt; (system withdrawals, &lt;a href=&quot;/EIPS/eip-4895&quot;&gt;EIP-4895&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For unaltered account balances:&lt;/p&gt;

&lt;p&gt;If an account’s balance changes during a transaction, but its post-transaction balance is equal to its pre-transaction balance, then the change MUST NOT be recorded in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;balance_changes&lt;/code&gt;. The sender and recipient address MUST still be included in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AccountChanges&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The following special cases require addresses to be included with empty changes if no other state changes occur:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Zero-value transfer recipients&lt;/li&gt;
  &lt;li&gt;Calling a same-transaction SELFDESTRUCT on an address that had a zero pre-transaction balance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A zero-value block reward MUST NOT trigger a balance change in the block access list and MUST NOT, by itself, cause the recipient address to be included. The recipient MUST still be included if it is accessed for other reasons (e.g., transaction fee accounting).&lt;/p&gt;

&lt;h4 id=&quot;code&quot;&gt;Code&lt;/h4&gt;

&lt;p&gt;Track &lt;strong&gt;post‑transaction runtime bytecode&lt;/strong&gt; for deployed or modified contracts, and &lt;strong&gt;delegation indicators&lt;/strong&gt; for successful delegations as defined in &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;nonce&quot;&gt;Nonce&lt;/h4&gt;

&lt;p&gt;Record &lt;strong&gt;post‑transaction nonces&lt;/strong&gt; for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;EOA senders.&lt;/li&gt;
  &lt;li&gt;Contracts that performed a successful &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Deployed contracts.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;edge-cases-normative&quot;&gt;Edge Cases (Normative)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;COINBASE / Fee Recipient:&lt;/strong&gt; The COINBASE address follows the same inclusion rules as any other account. It is included when accessed (e.g., during transaction fee accounting) and excluded when not accessed (e.g., empty blocks with no relevant withdrawals).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Precompiled contracts:&lt;/strong&gt; Precompiles MUST be included when accessed. If a precompile receives value, it is recorded with a balance change. Otherwise, it is included with empty change lists.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SENDALL:&lt;/strong&gt; For positive-value selfdestructs, the sender and beneficiary are recorded with a balance change.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SELFDESTRUCT (in-transaction):&lt;/strong&gt; Accounts destroyed within a transaction MUST be included in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AccountChanges&lt;/code&gt; without nonce or code changes. However, if the account had a positive balance pre-transaction, the balance change to zero MUST be recorded. Storage keys within the self-destructed contracts that were modified or read MUST be included as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_reads&lt;/code&gt; entry.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Accessed but unchanged:&lt;/strong&gt; Include the address with empty changes (e.g., targets of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODEHASH&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BALANCE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATICCALL&lt;/code&gt;, etc.).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Zero‑value transfers / Unchanged balance in transaction:&lt;/strong&gt; Include the address; omit from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;balance_changes&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gas refunds:&lt;/strong&gt; Record the &lt;strong&gt;final&lt;/strong&gt; balance of the sender after each transaction.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Block rewards:&lt;/strong&gt; Record the &lt;strong&gt;final&lt;/strong&gt; balance of the fee recipient after each transaction.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Exceptional halts:&lt;/strong&gt; Record the &lt;strong&gt;final&lt;/strong&gt; nonce and balance of the sender, and the &lt;strong&gt;final&lt;/strong&gt; balance of the fee recipient after each transaction. State changes from the reverted call are discarded, but all accessed addresses MUST be included. If no changes remain, addresses are included with empty lists; if storage was read, the corresponding keys MUST appear in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_reads&lt;/code&gt;. A transaction can halt on a runtime gas charge before the recipient is loaded (e.g., during &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorization processing); the recipient is then never accessed and MUST NOT be included unless accessed for another reason.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pre‑execution system contract calls:&lt;/strong&gt; All state changes MUST use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_access_index = 0&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Post‑execution system contract calls:&lt;/strong&gt; All state changes MUST use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_access_index = len(transactions) + 1&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;EIP-7702 Delegations:&lt;/strong&gt; The authority address MUST be included with nonce and code changes after any successful delegation set, update, or clear. If authorization fails after the authority address has been loaded and added to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessed_addresses&lt;/code&gt; (per &lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt;), it MUST still be included with an empty change set; if authorization fails before the authority is loaded, it MUST NOT be included. The delegation target MUST NOT be included during delegation creation or modification and MUST only be included once it is actually loaded as an execution target (e.g., via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALLCODE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DELEGATECALL&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATICCALL&lt;/code&gt; under authority execution).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;EIP‑4895 (Consensus layer withdrawals):&lt;/strong&gt; Recipients are recorded with their final balance after the withdrawal.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;EIP‑2935 (block hash):&lt;/strong&gt; Record system contract storage diffs of the &lt;strong&gt;single&lt;/strong&gt; updated storage slot in the ring buffer.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;EIP‑4788 (beacon root):&lt;/strong&gt; Record system contract storage diffs of the &lt;strong&gt;two&lt;/strong&gt; updated storage slots in the ring buffer.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;EIP‑7002 (withdrawals):&lt;/strong&gt; Record system contract storage diffs of storage slots &lt;strong&gt;0–3&lt;/strong&gt; (4 slots) after the dequeuing call. The dequeue also reads up to 3 × &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_WITHDRAWAL_REQUESTS_PER_BLOCK&lt;/code&gt; queue data slots (from slot 4 onward), which appear as storage_reads.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;EIP‑7251 (consolidations):&lt;/strong&gt; Record system contract storage diffs of storage slots &lt;strong&gt;0–3&lt;/strong&gt; (4 slots) after the dequeuing call. The dequeue also reads up to 4 × &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_CONSOLIDATION_REQUESTS_PER_BLOCK&lt;/code&gt; queue data slots (from slot 4 onward), which appear as storage_reads.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;engine-api&quot;&gt;Engine API&lt;/h3&gt;

&lt;p&gt;The Engine API is extended with new structures and methods to support block-level access lists:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ExecutionPayloadV4&lt;/strong&gt; extends ExecutionPayloadV3 with:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blockAccessList&lt;/code&gt;: RLP-encoded block access list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;engine_newPayloadV5&lt;/strong&gt; validates execution payloads:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Accepts &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadV4&lt;/code&gt; structure&lt;/li&gt;
  &lt;li&gt;Validates that computed access list matches provided &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blockAccessList&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INVALID&lt;/code&gt; if access list is malformed or doesn’t match&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;engine_getPayloadV6&lt;/strong&gt; builds execution payloads:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadV4&lt;/code&gt; structure&lt;/li&gt;
  &lt;li&gt;Collects all account accesses and state changes during transaction execution&lt;/li&gt;
  &lt;li&gt;Populates &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blockAccessList&lt;/code&gt; field with RLP-encoded access list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Block processing flow:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When processing a block:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The EL receives the BAL in the ExecutionPayload&lt;/li&gt;
  &lt;li&gt;The EL computes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_access_list_hash = keccak256(blockAccessList)&lt;/code&gt; and includes it in the block header&lt;/li&gt;
  &lt;li&gt;The EL executes the block and generates the actual BAL&lt;/li&gt;
  &lt;li&gt;If the generated BAL doesn’t match the provided BAL, the block is invalid (the hash in the header would be wrong)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The execution layer provides the RLP-encoded &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blockAccessList&lt;/code&gt; to the consensus layer via the Engine API. The consensus layer stores it as a field in the SSZ &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayload&lt;/code&gt; container. For long-term storage, the full &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blockAccessList&lt;/code&gt; bytes MAY be pruned and replaced by the field’s SSZ &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hash_tree_root&lt;/code&gt;, preserving the Merkle commitment within the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayload&lt;/code&gt; tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieval methods&lt;/strong&gt; for historical BALs:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_getPayloadBodiesByHashV2&lt;/code&gt;: Returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadBodyV2&lt;/code&gt; objects containing transactions, withdrawals, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blockAccessList&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_getPayloadBodiesByRangeV2&lt;/code&gt;: Returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayloadBodyV2&lt;/code&gt; objects containing transactions, withdrawals, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blockAccessList&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blockAccessList&lt;/code&gt; field contains the RLP-encoded BAL or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt; for pre-Amsterdam blocks or when data has been pruned.&lt;/p&gt;

&lt;p&gt;The EL MUST retain BALs for at least the duration of the weak subjectivity period (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;=3533 epochs&lt;/code&gt;) to support synchronization with re-execution after being offline for less than the WSP.&lt;/p&gt;

&lt;h3 id=&quot;state-transition-function&quot;&gt;State Transition Function&lt;/h3&gt;

&lt;p&gt;The state transition function must validate that the provided BAL matches the actual state accesses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation Note:&lt;/strong&gt; The BAL itself does not need to enter the state transition function. Implementations MAY validate by generating a virtual BAL during execution, hashing it, and comparing against the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_access_list_hash&lt;/code&gt; in the header. This is the approach used in the execution-specs reference implementation.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;validate_block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execution_payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block_header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# 1. Compute hash from received BAL and set in header
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;block_header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_access_list_hash&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keccak&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execution_payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blockAccessList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# 2. Execute block and collect actual accesses
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;actual_bal&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;execute_and_collect_accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execution_payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# 3. Verify actual execution matches provided BAL
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# If this fails, the block is invalid (the hash in the header would be wrong)
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;assert&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rlp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;actual_bal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;execution_payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blockAccessList&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;execute_and_collect_accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Execute block and collect all state accesses into BAL format&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# Pre-execution system contracts (block_access_index = 0)
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;track_system_contracts_pre&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block_access_index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# Execute transactions (block_access_index = 1..n)
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transactions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;execute_transaction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;track_state_changes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block_access_index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# Withdrawals and post-execution (block_access_index = len(txs) + 1)
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;post_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transactions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;withdrawal&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;withdrawals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;apply_withdrawal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;withdrawal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;track_balance_change&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;withdrawal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;post_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;track_system_contracts_post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;post_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;# Convert to BAL format and sort
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_bal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;track_state_changes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block_access_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Track all state changes from a transaction&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_touched_addresses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&apos;storage_writes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# slot -&amp;gt; [(index, value)]
&lt;/span&gt;                &lt;span class=&quot;s&quot;&gt;&apos;storage_reads&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&apos;balance_changes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&apos;nonce_changes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&apos;code_changes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        
        &lt;span class=&quot;c1&quot;&gt;# Track storage changes
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_storage_writes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;storage_writes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;storage_writes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;storage_writes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_access_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        
        &lt;span class=&quot;c1&quot;&gt;# Track reads (slots accessed but not written)
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_storage_reads&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;storage_writes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;storage_reads&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        
        &lt;span class=&quot;c1&quot;&gt;# Track balance, nonce, code changes
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;balance_changed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;balance_changes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_access_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nonce_changed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;nonce_changes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_access_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_nonce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;code_changed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;code_changes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_access_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;build_bal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Convert collected accesses to BAL format&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;bal&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()):&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Sort addresses lexicographically
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;accesses&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        
        &lt;span class=&quot;c1&quot;&gt;# Format storage changes: [slot, [[index, value], ...]]
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;storage_changes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;changes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt; 
                          &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;changes&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;storage_writes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())]&lt;/span&gt;
        
        &lt;span class=&quot;c1&quot;&gt;# Account entry: [address, storage_changes, reads, balance_changes, nonce_changes, code_changes]
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;bal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;storage_changes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nb&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;storage_reads&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])),&lt;/span&gt;
            &lt;span class=&quot;nb&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;balance_changes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]),&lt;/span&gt;
            &lt;span class=&quot;nb&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;nonce_changes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]),&lt;/span&gt;
            &lt;span class=&quot;nb&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;code_changes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The BAL MUST be complete and accurate. Missing or spurious entries invalidate the block. Spurious entries MAY be detected by validating BAL indices, which MUST never be higher than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;len(transactions) + 1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Clients MAY invalidate immediately if any transaction exceeds declared state.&lt;/p&gt;

&lt;p&gt;Clients MUST store BALs separately from blocks and make them available via the engine API.&lt;/p&gt;

&lt;h3 id=&quot;concrete-example&quot;&gt;Concrete Example&lt;/h3&gt;

&lt;p&gt;Example block:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pre-execution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;EIP-2935: Store parent hash at block hash contract (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x0000F90827F1C53a10cb7A02335B175320002935&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;EIP-7002: Omitted for simplicity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Transactions:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Alice (0xaaaa…) sends 1 ETH to Bob (0xbbbb…), checks balance of 0x2222…&lt;/li&gt;
  &lt;li&gt;Charlie (0xcccc…) calls factory (0xffff…) deploying contract at 0xdddd…&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Post-execution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Withdrawal of 100 ETH to Eve (0xabcd…)&lt;/li&gt;
  &lt;li&gt;EIP-7002 and EIP-7251 omitted for simplicity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: Pre-execution system contract uses block_access_index = 0. Post-execution withdrawal uses block_access_index = 3 (len(transactions) + 1)&lt;/p&gt;

&lt;p&gt;Resulting BAL (RLP structure):&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Addresses are sorted lexicographically
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# AccountChanges for 0x0000F90827F1C53a10cb7A02335B175320002935 (Block hash contract)
&lt;/span&gt;        &lt;span class=&quot;mh&quot;&gt;0x0000F90827F1C53a10cb7A02335B175320002935&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# storage_changes
&lt;/span&gt;            &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\x00&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\x0f\xa0&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# slot, [[block_access_index, parent_hash]]
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_reads
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# balance_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# nonce_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# code_changes
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# AccountChanges for 0x2222... (Address checked by Alice)
&lt;/span&gt;        &lt;span class=&quot;mh&quot;&gt;0x2222&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_reads
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# balance_changes (no change, just checked)
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# nonce_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# code_changes
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# AccountChanges for 0xaaaa... (Alice - sender tx 0)
&lt;/span&gt;        &lt;span class=&quot;mh&quot;&gt;0xaaaa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_reads
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;29&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a241a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# balance_changes: [[block_access_index, post_balance]]
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# nonce_changes: [[block_access_index, new_nonce]]
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# code_changes
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# AccountChanges for 0xabcd... (Eve - withdrawal recipient)
&lt;/span&gt;        &lt;span class=&quot;mh&quot;&gt;0xabcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_reads
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f5e100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# balance_changes: 100 ETH withdrawal
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# nonce_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# code_changes
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# AccountChanges for 0xbbbb... (Bob - recipient tx 0)
&lt;/span&gt;        &lt;span class=&quot;mh&quot;&gt;0xbbbb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_reads
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b9aca00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# balance_changes: +1 ETH
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# nonce_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# code_changes
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# AccountChanges for 0xcccc... (Charlie - sender tx 1)
&lt;/span&gt;        &lt;span class=&quot;mh&quot;&gt;0xcccc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_reads
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bc16d67&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# balance_changes: after gas
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# nonce_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# code_changes
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# AccountChanges for 0xdddd... (Deployed contract)
&lt;/span&gt;        &lt;span class=&quot;mh&quot;&gt;0xdddd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_reads
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# balance_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# nonce_changes: new contract nonce
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\x60\x80\x60\x40&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# code_changes: deployed bytecode
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# AccountChanges for 0xeeee... (COINBASE)
&lt;/span&gt;        &lt;span class=&quot;mh&quot;&gt;0xeeee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_reads
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f5e1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bebc2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# balance_changes: after tx fees
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# nonce_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# code_changes
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# AccountChanges for 0xffff... (Factory contract)
&lt;/span&gt;        &lt;span class=&quot;mh&quot;&gt;0xffff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# storage_changes
&lt;/span&gt;            &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\x00&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\x01&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\x00&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\xdd\xdd&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# slot 1, deployed address
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# storage_reads
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# balance_changes
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# nonce_changes: after CREATE
&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# code_changes
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;RLP-encoded and compressed: ~400-500 bytes.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;bal-design-choice&quot;&gt;BAL Design Choice&lt;/h3&gt;

&lt;p&gt;This design variant was chosen for several key reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Size vs parallelization&lt;/strong&gt;: BALs include all accessed addresses (even unchanged) for complete parallel IO and execution.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Storage values for writes&lt;/strong&gt;: Post-execution values enable state reconstruction during sync without individual proofs against state root.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Overhead analysis&lt;/strong&gt;: Historical data shows ~90 KiB average BAL size.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Transaction independence&lt;/strong&gt;: 60-80% of transactions access disjoint storage slots, enabling effective parallelization. The remaining 20-40% can be parallelized by having post-transaction state diffs.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;RLP encoding&lt;/strong&gt;: Native Ethereum encoding format, maintains compatibility with existing infrastructure.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;bal-size-considerations-60m-block-gas-limit&quot;&gt;BAL Size Considerations (60m block gas limit)&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Average BAL size&lt;/strong&gt;: ~92.1 KiB (compressed)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Storage writes: ~36.1 KiB (39.2%)&lt;/li&gt;
  &lt;li&gt;Storage reads: ~25.8 KiB (28.0%)&lt;/li&gt;
  &lt;li&gt;Balance diffs: ~9.2 KiB (10.0%)&lt;/li&gt;
  &lt;li&gt;Nonce diffs: ~1.9 KiB (2.1%)&lt;/li&gt;
  &lt;li&gt;Code diffs: ~1.4 KiB (1.5%)&lt;/li&gt;
  &lt;li&gt;Account addresses (with diffs): ~12.5 KiB (13.6%)&lt;/li&gt;
  &lt;li&gt;Touched-only addresses: ~3.3 KiB (3.6%)&lt;/li&gt;
  &lt;li&gt;RLP encoding overhead: ~1.8 KiB (1.9%)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Smaller than current worst-case calldata blocks.&lt;/p&gt;

&lt;p&gt;An empirical analysis has been done &lt;a href=&quot;/assets/eip-7928/bal_size_analysis&quot;&gt;here&lt;/a&gt;. An updated analysis for a 60 million block gas limit can be found &lt;a href=&quot;/assets/eip-7928/bal_size_analysis_60m&quot;&gt;here&lt;/a&gt;, and a refreshed one over more recent blocks (October 2026) &lt;a href=&quot;/assets/eip-7928/bal_size_analysis_60m_2026_10&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;asynchronous-validation&quot;&gt;Asynchronous Validation&lt;/h3&gt;

&lt;p&gt;BAL verification occurs alongside parallel IO and EVM operations without delaying block processing.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This proposal requires changes to the block structure and engine API that are not backwards compatible and require a hard fork.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;h3 id=&quot;validation-overhead&quot;&gt;Validation Overhead&lt;/h3&gt;

&lt;p&gt;Validating access lists and balance diffs adds validation overhead but is essential to prevent acceptance of invalid blocks.&lt;/p&gt;

&lt;h3 id=&quot;block-size&quot;&gt;Block Size&lt;/h3&gt;

&lt;p&gt;Increased block size impacts propagation but overhead (~70 KiB average) is reasonable for performance gains.&lt;/p&gt;

&lt;h3 id=&quot;spurious-storage-reads&quot;&gt;Spurious Storage Reads&lt;/h3&gt;

&lt;p&gt;Since &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_reads&lt;/code&gt; entries are not mapped to specific transaction indices, their validity can only be confirmed after executing all transactions. A malicious proposer could exploit this by declaring spurious storage reads that are never accessed, forcing clients into unnecessary I/O prefetching and data download while the block remains unrejectable until completion. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bal_items&lt;/code&gt; constraint bounds the number of such entries. Clients SHOULD additionally consider mechanisms to detect infeasible &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage_reads&lt;/code&gt; during execution and reject the block before it completes. Any such mechanism MUST NOT reject a valid block; in particular, the storage reads performed by system calls are not paid for by block gas and cannot be bounded by it.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7928</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7928</guid>
      </item>
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
      <item>
        <title>Increase Maximum Contract Size</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7954 - Increase Maximum Contract Size&lt;/strong&gt; is in Last Call status. It is authored by Giulio Rebuffo (@Giulio2002), Ben Adams (@benaadams) and was originally created 2025-06-09. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/increase-maximum-contract-size-to-48kb/24509&quot;&gt;https://ethereum-magicians.org/t/increase-maximum-contract-size-to-48kb/24509&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP proposes to raise the maximum allowed size for contract code deployed on Ethereum from 24,576 bytes to 65,536 bytes, and to raise the initcode size limit from 49,152 bytes to 131,072 bytes.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;The current 24KiB contract size limit can be restrictive for complex contracts and applications. Increasing the limit to 64KiB allows for more feature-rich contracts while maintaining reasonable constraints on block and state growth.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Update the &lt;a href=&quot;/EIPS/eip-170&quot;&gt;EIP-170&lt;/a&gt; contract code size limit of 24KiB (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x6000&lt;/code&gt; bytes) to 64KiB (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x10000&lt;/code&gt; bytes).&lt;/li&gt;
  &lt;li&gt;Update the &lt;a href=&quot;/EIPS/eip-3860&quot;&gt;EIP-3860&lt;/a&gt; initcode size limit of 48KiB (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xC000&lt;/code&gt; bytes) to 128KiB (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x20000&lt;/code&gt; bytes).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Developer Flexibility:&lt;/strong&gt; Enables more complex contracts and features.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Backward Compatibility:&lt;/strong&gt; Existing contracts are unaffected.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Simplicity:&lt;/strong&gt; Only the size limit is changed, with no other protocol modifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This change is not backwards compatible and must be activated via a network upgrade (hard fork). Contracts larger than 24KiB, up to 64KiB, will be deployable after activation.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;A higher contract size limit may marginally increase the risk of denial-of-service attacks via large contracts, but the new limit remains conservative.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7954</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7954</guid>
      </item>
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>eth/70 - partial block receipt lists</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7975 - eth/70 - partial block receipt lists&lt;/strong&gt; is in Last Call status. It is authored by Felix Lange &lt;fjl@ethereum.org&gt;, Jochem Brouwer (@jochem-brouwer), Giulio Rebuffo (@Giulio2002) and was originally created 2025-06-16. It is in the Networking category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7975-eth-70-partial-block-receipt-lists/24658&quot;&gt;https://ethereum-magicians.org/t/eip-7975-eth-70-partial-block-receipt-lists/24658&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP modifies the ‘eth’ p2p protocol to allow requesting partial block receipt lists.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;As Ethereum moves toward a higher block gas limit on mainnet, the worst-case total size of
a block receipts list also becomes larger, and may eventually exceed the 10MiB message size
limit commonly applied in clients. This can lead to sync failures.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;Modify the encoding for receipts in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Receipts (0x10)&lt;/code&gt; message as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;(eth/69): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[request-id: P, [[receipt₁, receipt₂], ...]]&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;(eth/70): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[request-id: P, lastBlockIncomplete: {0,1}, [[receipt₁, receipt₂], ...]]&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lastBlockIncomplete&lt;/code&gt; flag is set to true (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt;), the last receipt list does not
contain all receipts of the block, and the client will have to request the remaining
receipts of that block in a new request.&lt;/p&gt;

&lt;p&gt;To support such partial queries, we also modify the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetReceipts (0x0f)&lt;/code&gt; message:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;(eth/69): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[request-id: P, [blockhash₁: B_32, blockhash₂: B_32, ...]]&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;(eth/70): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[request-id: P, firstBlockReceiptIndex: P, [blockhash₁: B_32, blockhash₂: B_32, ...]]&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the first block in the list of requested block hashes, the server shall omit receipts
up to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;firstBlockReceiptIndex&lt;/code&gt; from the response.&lt;/p&gt;

&lt;p&gt;Downloading block receipts across multiple messages creates new attack surface. Partial
receipt lists cannot be verified against the block header, so in responses with
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lastBlockIncomplete = 1&lt;/code&gt;, the last receipts list must be validated in a different way:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Verify the total number of delivered receipts matches the count of transactions.&lt;/li&gt;
  &lt;li&gt;Verify the size of each receipt against the gas limit of the corresponding transaction,
i.e. reject if it is larger than gaslimit/8.&lt;/li&gt;
  &lt;li&gt;Verify the total downloaded receipts size is no larger than allowed by the block gas limit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;Since &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt; caps the gas limit of a single transaction to ~16.7M gas, a single
transaction receipt will always be limited in size. Specifically, a transaction can
produce at most 16777216/8 = 2MiB of log data.&lt;/p&gt;

&lt;p&gt;However, a block can contain multiple transactions, and thus the entire block
receipts list can be much larger. At a block gas limit of ~83M, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Receipts&lt;/code&gt; message
could exceed 10MiB. Clients typically reject messages above this size because their
validity can only be determined after fetching the complete message.&lt;/p&gt;

&lt;p&gt;For a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Receipts&lt;/code&gt; message, each block receipts list is validated by checking the full list
against the tree root stored in the block header. When downloading a paginated list across
multiple requests, the client must potentially buffer more than 10MB of unvalidated input.
This cannot be avoided, since the protocol allows receipt lists of such size at a high
block gas limit. However, we can at least bound the input size by applying sanity checks
as recommended in the specification section.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP changes the eth protocol and requires rolling out a new version, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/70&lt;/code&gt;.
Supporting multiple versions of a wire protocol is possible. Rolling out a new version
does not break older clients immediately, since they can keep using protocol version
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/69&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This EIP does not change consensus rules of the EVM and does not require a hard fork.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;None&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Mon, 16 Jun 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7975</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7975</guid>
      </item>
      
      
    
      
      
      
      <item>
        <title>Increase Calldata Floor Cost</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7976 - Increase Calldata Floor Cost&lt;/strong&gt; is in Last Call status. It is authored by Toni Wahrstätter (@nerolation) and was originally created 2025-06-18. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7976-further-increase-calldata-cost/24597&quot;&gt;https://ethereum-magicians.org/t/eip-7976-further-increase-calldata-cost/24597&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP proposes an adjustment to calldata pricing by raising the floor cost from 10/40 to 64/64 gas per calldata byte. This reduces the worst-case block size by ~37% with minimal impact.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;While &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt; successfully reduced the maximum possible block size by introducing a floor cost of 10/40 gas per byte for data-heavy transactions, continued increases in gas limit demands further optimization. The current floor cost still permits relatively large data-heavy payloads that contribute to block size variance. With 64/64 pricing, a 10 MiB uncompressed execution payload would require ~671M gas instead of ~105M gas under 10/40 pricing, providing significant headroom for gas limit increases.&lt;/p&gt;

&lt;p&gt;By increasing the floor cost to 64/64 gas per byte, this proposal aims to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Further reduce the maximum possible block size for data-heavy transactions&lt;/li&gt;
  &lt;li&gt;Create additional headroom for potential block gas limit increases&lt;/li&gt;
  &lt;li&gt;Maintain the same exemption for transactions with significant EVM computation&lt;/li&gt;
  &lt;li&gt;Have minimal impact on users&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Parameter&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STANDARD_TOKEN_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TOTAL_COST_FLOOR_PER_TOKEN&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;16&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tokens_in_calldata = zero_bytes_in_calldata + nonzero_bytes_in_calldata * 4&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;floor_tokens_in_calldata = (zero_bytes_in_calldata + nonzero_bytes_in_calldata) * 4&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Equivalently, the floor cost is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;64&lt;/code&gt; gas per calldata byte (both zero and non-zero), since &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TOTAL_COST_FLOOR_PER_TOKEN * 4 = 64&lt;/code&gt;. The token abstraction is retained only for consistency with &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;isContractCreation&lt;/code&gt; be a boolean indicating the respective event.&lt;/p&gt;

&lt;p&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_gas_used&lt;/code&gt; be the gas used for EVM execution with the gas refund subtracted.&lt;/p&gt;

&lt;p&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INITCODE_WORD_COST&lt;/code&gt; be 2 as defined in &lt;a href=&quot;/EIPS/eip-3860&quot;&gt;EIP-3860&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The formula for determining the gas used per transaction changes from &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt;’s implementation to:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gasUsed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;21000&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;STANDARD_TOKEN_COST&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tokens_in_calldata&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;execution_gas_used&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isContractCreation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;32000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;INITCODE_WORD_COST&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;words&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;calldata&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;TOTAL_COST_FLOOR_PER_TOKEN&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;floor_tokens_in_calldata&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Any transaction with a gas limit below &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21000 + TOTAL_COST_FLOOR_PER_TOKEN * floor_tokens_in_calldata&lt;/code&gt; or below its intrinsic gas cost (take the maximum of these two calculations) is considered invalid. This limitation exists because transactions must cover the floor price of their calldata without relying on the execution of the transaction. There are valid cases where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gasUsed&lt;/code&gt; will be below this floor price, but the floor price needs to be reserved in the transaction gas limit.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;With &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt;’s implementation, data-heavy transactions cost 10/40 gas per zero/non-zero byte, reducing the maximum possible EL payload size to approximately 1.07 MB (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;45_000_000/40&lt;/code&gt;). This EIP further reduces this to approximately 0.67 MB (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;45_000_000/64&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;By increasing calldata costs from 10/40 to 64/64 gas per byte for data-heavy transactions, this EIP provides:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Enhanced block size reduction&lt;/strong&gt;: Maximum data-heavy payload size drops by ~37%.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Maintained user experience&lt;/strong&gt;: Regular users engaging in DeFi, token transfers, and other EVM-heavy operations remain unaffected&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Better blob incentivization&lt;/strong&gt;: Higher calldata costs further encourage migration to blob usage for data availability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The floor cost mechanism ensures that transactions involving significant EVM computation continue to pay the standard 4/16 gas per byte for calldata, preserving the user experience for regular Ethereum operations.&lt;/p&gt;

&lt;p&gt;Analyzing the block range 20644414 - 23272414 (Sept. 2024 - Sept. 2025), 1.5% of all transactions would have been affected.&lt;/p&gt;

&lt;p&gt;An empirical analysis summarizing the impact of this EIP can be found in &lt;a href=&quot;/assets/eip-7976/eip7976_empirical_analysis&quot;&gt;this&lt;/a&gt; report.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This is a backwards incompatible gas repricing that requires a scheduled network upgrade.&lt;/p&gt;

&lt;p&gt;Wallet developers and node operators MUST update gas estimation handling to accommodate the new calldata cost rules. Specifically:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wallets&lt;/strong&gt;: Wallets using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth_estimateGas&lt;/code&gt; MUST be updated to ensure that they correctly account for the updated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TOTAL_COST_FLOOR_PER_TOKEN&lt;/code&gt; parameter of 16. Failure to do so could result in underestimating gas, leading to failed transactions.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Node Software&lt;/strong&gt;: RPC methods such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth_estimateGas&lt;/code&gt; MUST incorporate the updated formula for gas calculation with the new floor cost values.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Users can maintain their usual workflows without modification, as wallet and RPC updates will handle these changes.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;p&gt;Testing for this EIP should verify the correct application of the new calldata cost floor of 64/64 gas per byte:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Data-heavy transactions&lt;/strong&gt;: Verify transactions with minimal EVM execution pay the floor cost of 64 gas per calldata byte&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;EVM-heavy transactions&lt;/strong&gt;: Confirm transactions with significant computation continue using standard 4/16 gas per byte&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Edge cases&lt;/strong&gt;: Test transactions at the boundary where execution gas equals or exceeds the floor cost&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gas estimation&lt;/strong&gt;: Validate that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth_estimateGas&lt;/code&gt; correctly accounts for the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TOTAL_COST_FLOOR_PER_TOKEN&lt;/code&gt; value&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Invalid transactions&lt;/strong&gt;: Ensure transactions with insufficient gas limits are properly rejected&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;As the maximum possible block size is further reduced compared to &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt;, no additional security concerns are introduced beyond those already addressed in the original proposal.&lt;/p&gt;

&lt;p&gt;The same transaction bundling considerations from &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt; apply:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Transaction bundling was already possible and remains so&lt;/li&gt;
  &lt;li&gt;Bundling does not compromise the block size reduction objectives&lt;/li&gt;
  &lt;li&gt;Practical limitations (trust, coordination) continue to limit widespread bundling&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The increased floor cost strengthens the incentive structure for appropriate data availability method selection without introducing new attack vectors.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Wed, 18 Jun 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7976</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7976</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>Increase Access List Cost</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7981 - Increase Access List Cost&lt;/strong&gt; is in Last Call status. It is authored by Toni Wahrstätter (@nerolation) and was originally created 2024-12-27. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7981-increase-access-list-cost/24680&quot;&gt;https://ethereum-magicians.org/t/eip-7981-increase-access-list-cost/24680&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP charges access lists for their data footprint, preventing the circumvention of the &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt; floor pricing. This effectively reduces the worst-case block size by ~21% with minimal impact on users.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;Access lists are only priced for storage but not for their data.&lt;/p&gt;

&lt;p&gt;Furthermore, access lists can circumvent the &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt; floor pricing by contributing to EVM gas while still leaving a non-negligible data footprint. This enables achieving the maximal possible block size by combining access lists with calldata at a certain ratio.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Parameter&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;Source&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCESS_LIST_ADDRESS_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2400&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/EIPS/eip-2930&quot;&gt;EIP-2930&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCESS_LIST_STORAGE_KEY_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1900&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/EIPS/eip-2930&quot;&gt;EIP-2930&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TOTAL_COST_FLOOR_PER_TOKEN&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;16&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/EIPS/eip-7976&quot;&gt;EIP-7976&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_list_bytes&lt;/code&gt; be the total byte count of addresses (20 bytes each) and storage keys (32 bytes each) in the access list.&lt;/p&gt;

&lt;p&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_list_data_cost = 64 * access_list_bytes&lt;/code&gt; (i.e. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1280&lt;/code&gt; gas per address and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2048&lt;/code&gt; gas per storage key). The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;64&lt;/code&gt; gas-per-byte rate matches the &lt;a href=&quot;/EIPS/eip-7976&quot;&gt;EIP-7976&lt;/a&gt; calldata floor.&lt;/p&gt;

&lt;p&gt;The access list data cost is added as a flat surcharge to the gas used calculation, leaving the &lt;a href=&quot;/EIPS/eip-2930&quot;&gt;EIP-2930&lt;/a&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_list_cost&lt;/code&gt; and the &lt;a href=&quot;/EIPS/eip-7976&quot;&gt;EIP-7976&lt;/a&gt; floor calculation unchanged:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gasUsed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;21000&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access_list_data_cost&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;STANDARD_TOKEN_COST&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tokens_in_calldata&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;execution_gas_used&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isContractCreation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;32000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;INITCODE_WORD_COST&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;words&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;calldata&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access_list_cost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;TOTAL_COST_FLOOR_PER_TOKEN&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;floor_tokens_in_calldata&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Any transaction with a gas limit below &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gasUsed&lt;/code&gt; evaluated with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_gas_used = 0&lt;/code&gt; is considered invalid.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;Access list data is always charged at floor rate (added to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_list_cost&lt;/code&gt;), and access list tokens are included in the floor calculation. This ensures:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Access list data always pays floor rate regardless of execution level&lt;/li&gt;
  &lt;li&gt;Access lists cannot be used to bypass the calldata floor pricing&lt;/li&gt;
  &lt;li&gt;Consistent pricing across all transaction data sources&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This is a backwards incompatible gas repricing that requires a scheduled network upgrade.&lt;/p&gt;

&lt;p&gt;Requires updates to gas estimation in wallets and nodes. Normal usage patterns remain largely unaffected.&lt;/p&gt;

&lt;h2 id=&quot;reference-implementation&quot;&gt;Reference Implementation&lt;/h2&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;calculate_access_list_data_cost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;access_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;EIP-7981: flat 64 gas per byte of access list data.&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Each access entry: 20-byte address + 32 bytes per storage key
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;total_bytes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;32&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;access&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total_bytes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;64&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;calculate_intrinsic_cost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
    Calculate intrinsic gas cost and floor gas cost.
    Both include the EIP-7981 access list data surcharge, so that
    tx.gasUsed = max(intrinsic_gas + execution_gas_used, floor_gas).
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Calldata tokens (EIP-7976)
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;zero_bytes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count_zero_bytes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;nonzero_bytes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zero_bytes&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;tokens_in_calldata&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zero_bytes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nonzero_bytes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;floor_tokens_in_calldata&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Access list cost (EIP-2930, unchanged) and EIP-7981 data surcharge
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;access_list_cost&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;access_list_data_cost&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;has_access_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;access_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;access_list_cost&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;ACCESS_LIST_ADDRESS_COST&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;access&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ACCESS_LIST_STORAGE_KEY_COST&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;access_list_data_cost&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calculate_access_list_data_cost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;access_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# EIP-7976 floor (calldata only) plus EIP-7981 surcharge
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;floor_gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;TX_BASE_COST&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;floor_tokens_in_calldata&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TOTAL_COST_FLOOR_PER_TOKEN&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access_list_data_cost&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Intrinsic gas plus EIP-7981 surcharge
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;calldata_cost&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tokens_in_calldata&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;STANDARD_TOKEN_COST&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;create_cost&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TX_CREATE_COST&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;init_code_cost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;is_create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;intrinsic_gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;TX_BASE_COST&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calldata_cost&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;create_cost&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access_list_cost&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;access_list_data_cost&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;intrinsic_gas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;floor_gas&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;This EIP closes a loophole that allows circumventing &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt; floor pricing. Without this fix, attackers can achieve larger blocks than intended by combining access lists with calldata. All transaction data sources now contribute to the floor calculation consistently.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 27 Dec 2024 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7981</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7981</guid>
      </item>
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
      <item>
        <title>Deterministic Factory Contract</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #7997 - Deterministic Factory Contract&lt;/strong&gt; is in Last Call status. It is authored by Francisco Giordano (@frangio), Toni Wahrstätter (@nerolation), Nick Johnson (@Arachnid), Jochem Brouwer (@jochem-brouwer) and was originally created 2025-08-03. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-7997-deterministic-factory-predeploy/24998&quot;&gt;https://ethereum-magicians.org/t/eip-7997-deterministic-factory-predeploy/24998&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;The availability of a well-known &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; factory at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x4e59b44847b379578588920cA78FbF26c0B4956C&lt;/code&gt; is made a formal requirement to enable deterministic deployments at identical addresses across EVM chains. This benefits developer experience, user experience, and security, in particular for multi-chain and cross-chain applications, including account abstraction.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;There are now a large number of EVM chains where users want to transact and developers want to deploy applications, and we can expect this number to continue to grow in line with Ethereum’s rollup-centric roadmap and the general adoption of programmable blockchains. Most applications support multiple chains and aspire to support as many as possible, and their developers widely prefer to deploy contracts at identical addresses across all chains as a &lt;em&gt;multi-chain deterministic deployment&lt;/em&gt;. This kind of deployment reduces the number of addresses that must be distributed to use the application, so that it no longer scales with the number of supported chains. This simplification has many benefits throughout the stack: interfaces and SDKs need to embed and trust fewer addresses, and other contracts that depend on them can be implemented without chain-specific customization (which in turn makes them amenable to multi-chain deployment).&lt;/p&gt;

&lt;p&gt;This kind of deployment is also highly desirable and important for account abstraction. Without it, a user’s smart contract accounts are deployed at different addresses on different chains, and each account is tied to a single chain. This limitation is difficult to explain to users and has caused loss of funds. If smart contract accounts cannot be multi-chain like EOAs, they offer downgraded UX and are more prone to error.&lt;/p&gt;

&lt;p&gt;There is currently no native or fully robust way to perform multi-chain deterministic deployments. While &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; enables deterministic deployments, the created address is computed from that of the contract that invokes the instruction, so a &lt;em&gt;factory&lt;/em&gt; that is itself multi-chain is required for bootstrapping. Four workarounds are currently known to deploy such a factory:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A keyless transaction crafted using Nick’s method that can be posted permissionlessly to new chains.&lt;/li&gt;
  &lt;li&gt;Private keys held by some party used to sign creation transactions for each chain as needed.&lt;/li&gt;
  &lt;li&gt;A private key intentionally leaked so that any party can permissionlessly create an &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; signed delegation and deploy a factory from the leaked account.&lt;/li&gt;
  &lt;li&gt;Factories already deployed on other chains (by any of the previous methods) inserted in a new chain at genesis or via a hard fork.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keyless transactions have been the most successful approach. However, since such transactions have a fixed gas price and limit, they have often been impossible to deploy on chains where those gas parameters are insufficient or invalid. The same issue has begun to affect Ethereum itself and its devnets due to changes to the gas schedule. This EIP formalizes the guarantee that an already widely used keyless &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; factory should be available on EVM chains, whether deployed by an ordinary transaction (including its keyless transaction), or included in genesis.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FACTORY_ADDRESS&lt;/code&gt; = &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x4e59b44847b379578588920cA78FbF26c0B4956C&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The chain’s state MUST include &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FACTORY_ADDRESS&lt;/code&gt; with nonzero nonce and this runtime code:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A chain may satisfy this requirement by either of the following means that results in the account above: deploying the factory with an ordinary transaction (for example, its keyless creation transaction) where the chain’s gas parameters permit it, or including the account in the genesis state with a nonce equal to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt;. Regardless of the method used, the resulting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FACTORY_ADDRESS&lt;/code&gt; account MUST have the runtime code specified above. If the chain is already running with gas parameters that no longer allow deployment via the keyless transaction, the only way to add the contract at the expected address is a coordinated irregular state transition, which is outside the scope of this EIP. Client software MUST NOT check for the existence of the contract at the fork boundary.&lt;/p&gt;

&lt;p&gt;This is a contract that invokes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; instruction (&lt;a href=&quot;/EIPS/eip-1014&quot;&gt;EIP-1014&lt;/a&gt;) with a salt equal to the first 32 bytes of the call’s input data, init code equal to the remaining data, and value equal to the call’s value. If input data is smaller than 32 bytes, the contract will attempt to copy close to 2^256 bytes of calldata and should revert as a result. If contract creation fails (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; outputs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;), the call reverts with empty return data. When successful, the address is returned in exactly 20 bytes of data with no padding.&lt;/p&gt;

&lt;p&gt;The above runtime bytecode disassembles to the following:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-asm&quot;&gt;push32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
calldatasize
add

push1 0x00
dup2
push1 0x20
dup3
calldatacopy

dup1
calldataload

dup3
dup3
callvalue
create2
dup1
iszero
iszero
push1 0x39
jumpi

dup2
dup3
revert

jumpdest
dup1
dup3
mstore
pop
pop
pop
push1 0x14
push1 0x0c
return
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;choice-of-factory&quot;&gt;Choice of factory&lt;/h3&gt;

&lt;p&gt;The factory at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x4e59b44847b379578588920cA78FbF26c0B4956C&lt;/code&gt; has been used close to 25000 times on Ethereum Mainnet, deployed to hundreds of chains using its keyless transaction, included in multiple L2s by default, and used as the default factory for deterministic deployments in developer tools.&lt;/p&gt;

&lt;p&gt;The bytecode is compatible with any EVM chain that has activated EIP-1014, which Ethereum included in Constantinople. In particular, it does not depend on the more recent &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUSH0&lt;/code&gt; (&lt;a href=&quot;/EIPS/eip-3855&quot;&gt;EIP-3855&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Two known downsides of this factory were considered. First, the address of the created account is returned with no padding, and may need to be decoded differently to other address-returning calls. Second, returndata is not propagated in case of revert, and an EVM trace may be required for obtaining a diagnostic error message. Both issues were considered non-blocking due to the existence of workarounds, including the possibility of using this factory to deploy further improved factories. Notably, if such factories are fully deterministic and permissionlessly deployable (and only require baseline EVM features), they are guaranteed to exist or be deployable at the same address on the same set of chains.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;No backwards compatibility issues are introduced. On chains that already have the factory at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FACTORY_ADDRESS&lt;/code&gt; (Ethereum Mainnet and most others), satisfying this requirement is a no-op. No other contract is expected at this address.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;h3 id=&quot;frontrunnable-deployments&quot;&gt;Frontrunnable deployments&lt;/h3&gt;

&lt;p&gt;The deployment of contracts that read the environment (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ORIGIN&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NUMBER&lt;/code&gt;, etc.) may be frontrun and created with attacker-chosen parameters. It’s recommended to use this factory to deploy fully deterministic contracts only.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Sun, 03 Aug 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-7997</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-7997</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
      <item>
        <title>Backward compatible SWAPN, DUPN, EXCHANGE</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8024 - Backward compatible SWAPN, DUPN, EXCHANGE&lt;/strong&gt; is in Last Call status. It is authored by Francisco Giordano (@frangio), Charles Cooper (@charles-cooper), Alex Beregszaszi (@axic), Paweł Bylica (@chfast) and was originally created 2025-08-16. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8024-backward-compatible-swapn-dupn-exchange/25486&quot;&gt;https://ethereum-magicians.org/t/eip-8024-backward-compatible-swapn-dupn-exchange/25486&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Currently, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAP*&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUP*&lt;/code&gt; instructions are limited to a stack depth of 16. Introduce three new instructions, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAPN&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUPN&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE&lt;/code&gt; which lift this limitation and allow accessing the stack at higher depths.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;While the stack is 1024 items deep, easy access is only possible for the top 16 items. Supporting more local variables is possible via manually keeping them in memory or through a “stack to memory elevation” in a compiler. This can result in complex and inefficient code.&lt;/p&gt;

&lt;p&gt;Furthermore, implementing higher level constructs, such as functions, on top of EVM will result in a list of input and output parameters as well as an instruction offset to return to.&lt;/p&gt;

&lt;p&gt;The number of these arguments (or stack items) can easily exceed 16 and thus will require extra care from a compiler to lay them out in a way that all of them are still accessible.&lt;/p&gt;

&lt;p&gt;Lastly, swapping items besides the 1st and Nth items in the stack is very important for compilers implementing stack scheduling algorithms (the analog of register allocation for stack machines), which try to minimize stack traffic given a set of variables and usage analysis.&lt;/p&gt;

&lt;p&gt;Introducing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAPN&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUPN&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE&lt;/code&gt; will provide an option to compilers to simplify accessing deep stack items.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;We introduce three new instructions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUPN&lt;/code&gt;     (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xe6&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAPN&lt;/code&gt;    (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xe7&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xe8&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each instruction carries one or two immediate operands. Informally, using 1-based indexing, the semantics are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUPN n&lt;/code&gt;: The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n&lt;/code&gt;‘th stack item is duplicated at the top of the stack.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAPN n&lt;/code&gt;: The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n + 1&lt;/code&gt;‘th stack item is swapped with the top of the stack.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE n m&lt;/code&gt;: The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n + 1&lt;/code&gt;‘th stack item is swapped with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;m + 1&lt;/code&gt;‘th stack item.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Formally, when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code[pc]&lt;/code&gt; is one of these opcodes, the VM executes as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUPN&lt;/code&gt;:
    &lt;ol&gt;
      &lt;li&gt;Charge 3 gas.&lt;/li&gt;
      &lt;li&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x = code[pc + 1]&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;90 &amp;lt; x &amp;lt; 128&lt;/code&gt;, halt with exceptional failure.&lt;/li&gt;
      &lt;li&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n = decode_single(x)&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n &amp;gt; len(stack)&lt;/code&gt;, halt with exceptional failure.&lt;/li&gt;
      &lt;li&gt;Push &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stack[top - n + 1]&lt;/code&gt; on the stack.&lt;/li&gt;
      &lt;li&gt;Set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pc = pc + 2&lt;/code&gt;.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAPN&lt;/code&gt;:
    &lt;ol&gt;
      &lt;li&gt;Charge 3 gas.&lt;/li&gt;
      &lt;li&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x = code[pc + 1]&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;90 &amp;lt; x &amp;lt; 128&lt;/code&gt;, halt with exceptional failure.&lt;/li&gt;
      &lt;li&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n = decode_single(x)&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n + 1 &amp;gt; len(stack)&lt;/code&gt;, halt with exceptional failure.&lt;/li&gt;
      &lt;li&gt;Swap &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stack[top - n]&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stack[top]&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;Set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pc = pc + 2&lt;/code&gt;.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE&lt;/code&gt;:
    &lt;ol&gt;
      &lt;li&gt;Charge 3 gas.&lt;/li&gt;
      &lt;li&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x = code[pc + 1]&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;81 &amp;lt; x &amp;lt; 128&lt;/code&gt;, halt with exceptional failure.&lt;/li&gt;
      &lt;li&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n, m = decode_pair(x)&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;m + 1 &amp;gt; len(stack)&lt;/code&gt;, halt with exceptional failure.&lt;/li&gt;
      &lt;li&gt;Swap &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stack[top - n]&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stack[top - m]&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;Set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pc = pc + 2&lt;/code&gt;.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code[pc + 1]&lt;/code&gt; evaluates to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; if beyond the end of the code, matching &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUSH&lt;/code&gt; behavior.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;top&lt;/code&gt; denotes the index of the value at the top of the stack.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JUMPDEST&lt;/code&gt; analysis is unchanged. In particular, if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code[i]&lt;/code&gt; is at an instruction boundary and is one of these opcodes, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code[i + 1]&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x5b&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JUMPDEST&lt;/code&gt;), then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code[i + 1]&lt;/code&gt; is a valid jump target. Note that in this case the execution of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code[i]&lt;/code&gt; would halt at step 2 above (because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x = code[i + 1] = 0x5b = 91&lt;/code&gt;). Disassemblers must decode such &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code[i]&lt;/code&gt; as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INVALID&lt;/code&gt; (or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INVALID_DUPN&lt;/code&gt;, etc.) and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code[i + 1]&lt;/code&gt; as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JUMPDEST&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The auxiliary functions &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;decode_single&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;decode_pair&lt;/code&gt; are defined by the following Python code:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;decode_single&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Returns n with 17 &amp;lt;= n &amp;lt;= 235.&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;assert&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;145&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;256&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;decode_pair&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;tuple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Returns (n, m) with 1 &amp;lt;= n &amp;lt;= 14 and n &amp;lt; m &amp;lt;= 30 - n.&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;assert&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;81&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;128&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;^&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;143&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;divmod&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;29&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Assemblers and compilers must emit a 1-byte immediate after each of these opcodes that decodes to the required &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n, m&lt;/code&gt; operands. For reference, this can be done by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encode_single&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encode_pair&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;encode_single&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;assert&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;17&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;235&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;111&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;256&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;encode_pair&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;assert&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;29&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;^&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;143&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;use-of-an-immediate-operand&quot;&gt;Use of an immediate operand&lt;/h3&gt;

&lt;p&gt;Allowing dynamic selection of the arguments to swap or dup could be used to prevent static analysis of the contents of the stack. Since static analysis is an important tool for security auditors we want to do what we can to make their jobs easier. Hence, the operands require an immediate operand that is not dynamic in nature.&lt;/p&gt;

&lt;h3 id=&quot;disallowed-immediate-range&quot;&gt;Disallowed immediate range&lt;/h3&gt;

&lt;p&gt;A property the EVM has is that it’s not possible to jump to the middle of an instruction. In order to guarantee this property, the immediate operands of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUSH*&lt;/code&gt; instructions are masked from jumpdest analysis so that the occurrence of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x5b&lt;/code&gt; in them is not mistaken for a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JUMPDEST&lt;/code&gt; instruction, which should be considered a valid jump target elsewhere.&lt;/p&gt;

&lt;p&gt;The new instructions in this EIP preserve this property without changing jumpdest analysis by making it invalid for their immediates to contain &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x5b&lt;/code&gt;, in addition to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x60&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x7f&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUSH1&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUSH32&lt;/code&gt;) since those would cause the subsequent instructions to be masked.&lt;/p&gt;

&lt;p&gt;The alternative, changing jumpdest analysis to introduce new masked opcodes, would create a backwards incompatibility if done without bytecode versioning (EOF). Consider the bytecode sequence &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e6 5b&lt;/code&gt; that decodes to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INVALID JUMPDEST&lt;/code&gt; prior to this EIP, and thus contains a valid jump target. If an instruction &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUPN x&lt;/code&gt; were introduced with encoding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e6 {x}&lt;/code&gt; (opcode immediately followed by operand), and jumpdest analysis changed to mask the operand to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e6&lt;/code&gt;, the same bytecode sequence &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e6 5b&lt;/code&gt; would then decode to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUPN 0x5b&lt;/code&gt;. As a result of the upgrade, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5b&lt;/code&gt; would become an invalid jump target, breaking contracts that include this sequence. The opposite can happen with push opcodes, for example, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e6 60 5b&lt;/code&gt; would transform from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INVALID PUSH1 0x5b&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUPN 0x60 JUMPDEST&lt;/code&gt;, creating a new valid jump target. Furthermore, this may have a cascading effect on arbitrarily many subsequent instructions.&lt;/p&gt;

&lt;p&gt;Since the EVM doesn’t offer a dedicated section for data, arbitrary data may be embedded in code and serve as immutable data storage accessed via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CODECOPY&lt;/code&gt;. Therefore, we must assume that arbitrary byte sequences may be found in contracts that have been deployed or are included in transactions yet to be published on chain.&lt;/p&gt;

&lt;p&gt;This EIP is designed to uphold the following backwards compatibility guarantee: every possible execution trace on a given bytecode that does not attempt to execute an undefined opcode must continue to produce the same effect after the introduction of an instruction. No new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JUMPDEST&lt;/code&gt;s must be created in a given bytecode by the introduction of an instruction and none may be removed.&lt;/p&gt;

&lt;p&gt;This encoding can be reused in future instructions with immediate operands, although it is not necessary if the range of the operand naturally does not include the bytes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x5b&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JUMPDEST&lt;/code&gt;) or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x60&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUSH1&lt;/code&gt;) to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x7f&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUSH32&lt;/code&gt;), in which case masking is not necessary.&lt;/p&gt;

&lt;h3 id=&quot;exchange-immediate&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE&lt;/code&gt; immediate&lt;/h3&gt;

&lt;p&gt;A previous formulation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE&lt;/code&gt; allowed swapping stack elements only if they were within some distance. As a result, it would be possible to swap the elements at indices 30 and 29, but not possible to move an element from index 30 to 2 with a single instruction. The current formulation prioritizes the latter, on the assumption that it is more valuable to move elements closer to the top of the stack than it is to rearrange elements deeper in the stack.&lt;/p&gt;

&lt;p&gt;In addition, the exact formulation was chosen to make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;decode_pair&lt;/code&gt; a simple function using only basic arithmetic, bitwise operations (division by 16), and few branches. A small trade-off in the number of addressable pairs was made to reduce the number of necessary branches; this implies some of the immediate range is not allocated, and it could be used to add a dozen more addressable pairs at the cost of more decoding complexity, potentially in a future network upgrade.&lt;/p&gt;

&lt;p&gt;Finally, note that the operands in the assembly instruction &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE n m&lt;/code&gt; appear “off by one”, i.e. it operates on the stack elements at depths &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n + 1&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;m + 1&lt;/code&gt;. These offsets were chosen to match the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAP&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAPN&lt;/code&gt; opcodes such that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE n m&lt;/code&gt; has an effect equivalent to the sequence &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAP{n} SWAP{m} SWAP{n}&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;size-of-immediate-operand&quot;&gt;Size of immediate operand&lt;/h3&gt;

&lt;p&gt;For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUPN&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAPN&lt;/code&gt; a 16-bit size was considered to accommodate the full stack space of 1024 items, however:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;that would require an additional restriction/check (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n &amp;lt; 1024&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;the 256 depth is a large improvement over the current 16 and the overhead of an extra byte would make it less useful&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Similarly for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE&lt;/code&gt;, the proposed scheme allows addressing of 30 items.&lt;/p&gt;

&lt;h3 id=&quot;gas-cost&quot;&gt;Gas cost&lt;/h3&gt;

&lt;p&gt;The gas cost for these operations is the same as for existing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DUP*&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAP*&lt;/code&gt; instructions, because they are just implemented as pointer swaps and immediate decoding is negligible.&lt;/p&gt;

&lt;h3 id=&quot;exchange-vs-swapn&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE&lt;/code&gt; vs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAPN&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;As mentioned before, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXCHANGE&lt;/code&gt; is important to compilers implementing stack scheduling algorithms. Specifically, in the case that a stack item is scheduled to be consumed deeper in the stack (for instance, the 3rd item in the stack needs to be moved into 2nd position in order to be consumed by the next operation), that currently takes three instructions, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SWAP2 SWAP3 SWAP2&lt;/code&gt;. However, in the EVM implementation, the implementation is just a pointer swap, so it could be implemented in a single instruction at no extra runtime cost to the client.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This has no effect on contracts that would never attempt to execute the opcodes allocated by this EIP. The jump targets of existing contracts are preserved.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;h3 id=&quot;assemblydisassembly&quot;&gt;Assembly/Disassembly&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e680&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[DUPN 17]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e7db&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[SWAPN 108]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e6805b&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[DUPN 17, JUMPDEST]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e75b&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[INVALID_SWAPN, JUMPDEST]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e6605b&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[INVALID_DUPN, PUSH1 0x5b]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e7610000&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[INVALID_SWAPN, PUSH2 0x0000]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e65f&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[INVALID_DUPN, PUSH0]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e89d&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[EXCHANGE 2 3]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e82f&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[EXCHANGE 1 19]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e850&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[EXCHANGE 14 16]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e851&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[EXCHANGE 14 15]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e852&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[INVALID_EXCHANGE, MSTORE]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;execution&quot;&gt;Execution&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;60016000808080808080808080808080808080e680&lt;/code&gt; results in 18 stack items, the top of the stack valued 1, the bottom of the stack valued 1, the rest valued 0&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;600160008080808080808080808080808080806002e780&lt;/code&gt; results in 18 stack items, the top of the stack valued 1, the bottom of the stack valued 2, the rest valued 0&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;600260008080808080600160008080808080808080e8&lt;/code&gt; at the end of code results in 17 stack items, the bottom of the stack valued 1, the 10th stack item from the top valued 2, the rest valued 0&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;600060016002e88e&lt;/code&gt; results in 3 stack items, from top to bottom: [2, 0, 1]&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;600080808080808080808080808080808080808080808080808080808060016002e88f&lt;/code&gt; results in 30 stack items, the top of the stack valued 2, the bottom of the stack valued 1, the rest valued 0&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e75b&lt;/code&gt; reverts&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;600456e65b&lt;/code&gt; executes successfully (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUSH 04 JUMP INVALID_DUPN JUMPDEST&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;60008080e88e15&lt;/code&gt; results in 3 stack items, the top of the stack valued 1, the rest valued 0&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e852&lt;/code&gt; reverts&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;6000808080808080808080808080808080e680&lt;/code&gt; results in exceptional halt&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;The authors are not aware of any additional risks introduced here. The EVM stack is fixed at 1024 items and most implementations keep that in memory at all times. This change will increase the number of stack items accessible via single instruction.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Sat, 16 Aug 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8024</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8024</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
      <item>
        <title>State Creation Gas Cost Increase</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8037 - State Creation Gas Cost Increase&lt;/strong&gt; is in Last Call status. It is authored by Maria Silva (@misilva73), Carlos Perez (@CPerezz), Jochem Brouwer (@jochem-brouwer), Ansgar Dietrichs (@adietrichs), Łukasz Rozmej (@LukaszRozmej), Anders Elowsson (@anderselowsson), Francesco D&apos;Amato (@fradamt), Dragan Rakita (@rakita), Paweł Bylica (@chfast), Spencer Taylor-Brown (@spencer-tb), Gary Rong (@rjl493456442) and was originally created 2025-10-01. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8037-state-creation-gas-cost-increase/25694&quot;&gt;https://ethereum-magicians.org/t/eip-8037-state-creation-gas-cost-increase/25694&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This proposal increases the cost of state creation operations, thus avoiding excessive state growth under increased block gas limits. It introduces a new variable, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; (cost per state byte), and sets this unit of gas costs per new state byte by targeting an average state growth of 120 GiB per year at a reference block gas limit of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;150M&lt;/code&gt; gas units. It also introduces an independent metering for state creation costs, thus allowing for increased throughput and for larger contract deployments without being limited by the single transaction gas limit.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;State creation does not have a harmonized cost, with different methods incurring varied costs for creating the same size of new state. For instance, while contract deployment only costs ~200 gas units per new byte created, new storage slots cost ~313 gas units per new byte created. Also, deploying duplicated bytecode costs the same as deploying new bytecode, even though clients don’t store duplicated code in the database. This proposal establishes a standard to harmonize all state creation operations.&lt;/p&gt;

&lt;p&gt;Additionally, state growth will become a bottleneck for scaling under higher block limits. As of January 2026, the current database size in a Geth node dedicated to state is ~390 GiB. After the increase in gas limit from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;30M&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;60M&lt;/code&gt; gas units, the average size of new state created each day more than tripled, from ~105 MiB to ~326 MiB. This results in an annual growth of ~116 GiB.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/eip-8037/new_state_added.png&quot; alt=&quot;new_state_added&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The state-growth response we observe is not linear in the gas limit increase: a 2× bump (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;30M&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;60M&lt;/code&gt;) produced a roughly 3× jump in daily new state, suggesting a one-off shift in user behavior rather than a steady-state ratio. Treating the post-bump rate as the new baseline and extrapolating proportionally to the new gas limit, at a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;200M&lt;/code&gt; gas limit, the state would grow at a rate of ~387 GiB per year. Starting from 390 GiB, this rate would breach the 650 GiB threshold (at which point nodes begin experiencing performance degradation) in less than a year.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;new-parameters&quot;&gt;New parameters&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Parameter&lt;/strong&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1530&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_STORAGE_SET&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;120&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_AUTH_BASE&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYSTEM_MAX_SSTORES_PER_CALL&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_TOTAL_GAS_LIMIT&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4,294,967,295 (2^32 - 1)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;parameter-changes&quot;&gt;Parameter changes&lt;/h3&gt;

&lt;p&gt;Upon activation of this EIP, the following parameters of the gas model are updated. The “New State Gas” column shows the state gas cost (charged to the state-gas dimension), while the “New Execution Gas” column shows additional execution gas costs that accompany the state gas charge.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;strong&gt;Parameter&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Current&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;New State Gas&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;New Execution Gas&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Operations affected&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;32,000&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT x CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CODE_DEPOSIT&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;200/byte&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; per byte&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;6 × ceil(len/32)&lt;/code&gt; (hash cost)&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;25,000&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT x CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_STORAGE_SET&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;20,000&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_STORAGE_SET x CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PER_EMPTY_ACCOUNT_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;25,000&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT x CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;EOA delegation&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PER_AUTH_BASE_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;12,500&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_AUTH_BASE x CPSB&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;EOA delegation&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt; is defined as the sum of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Calldata cost: 1,616 (101 bytes × 16), where 101 is the byte size of an &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorization tuple (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chain_id&lt;/code&gt; 8 + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;address&lt;/code&gt; 20 + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nonce&lt;/code&gt; 8 + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y_parity&lt;/code&gt; 1 + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;r&lt;/code&gt; 32 + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s&lt;/code&gt; 32). This is a representative size, not a worst case, since &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chain_id&lt;/code&gt; is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint256&lt;/code&gt; and may exceed 8 bytes.&lt;/li&gt;
  &lt;li&gt;Recovering authority address (ecRecover): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PRECOMPILE_ECRECOVER&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Reading nonce and code of authority (cold access): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; (is updated by &lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Storing values in an already warm account: 2 x &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt; are defined and updated in &lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt;. The values are not yet final.&lt;/p&gt;

&lt;h3 id=&quot;multidimensional-metering-for-state-creation-costs&quot;&gt;Multidimensional metering for state creation costs&lt;/h3&gt;

&lt;p&gt;Besides the parameter changes, this proposal introduces an independent metering for state creation costs. Two gas dimensions are introduced, execution-gas and state-gas. For state creation operations, the “new state costs” are charged to state-gas, while the “new execution costs” are charged to execution-gas. The costs of all other operations are charged to execution-gas.&lt;/p&gt;

&lt;p&gt;At transaction level, the user pays for both execution-gas and state-gas. The total gas cost of a transaction is the sum of both dimensions. In addition, the transaction gas limit set in &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt; only applies to execution-gas, while state-gas is capped by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas&lt;/code&gt;, which this proposal in turn caps at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_TOTAL_GAS_LIMIT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At the block level, only the gas used in the bottleneck resource is considered when checking if the block is full and when updating the base fee for the next block. This gives a new meaning to the block’s gas limit and the block’s gas target: each now bounds the bottleneck resource (the dimension with the highest cumulative gas used) rather than a single combined gas counter.&lt;/p&gt;

&lt;h4 id=&quot;transaction-validation&quot;&gt;Transaction validation&lt;/h4&gt;

&lt;p&gt;Before transaction execution, inclusion of a transaction in a block requires that:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The transaction’s &lt;strong&gt;gas limit is not higher than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_TOTAL_GAS_LIMIT&lt;/code&gt;&lt;/strong&gt;. Concretely, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas &amp;lt;= TX_MAX_TOTAL_GAS_LIMIT&lt;/code&gt;. Unlike &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt;’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_GAS_LIMIT&lt;/code&gt;, which this proposal applies to execution-gas only, this bound applies to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas&lt;/code&gt; as a whole and therefore to the sum of both dimensions.&lt;/li&gt;
  &lt;li&gt;The transaction’s &lt;strong&gt;intrinsic gas is not higher than &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt;’s transaction cap&lt;/strong&gt;. Concretely, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max(intrinsic_gas, calldata_floor_gas_cost) &amp;lt;= TX_MAX_GAS_LIMIT&lt;/code&gt;. Under &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;intrinsic_gas&lt;/code&gt; is state-independent and charged entirely in execution-gas; there is no intrinsic state-gas component.&lt;/li&gt;
  &lt;li&gt;For each gas dimension, the &lt;strong&gt;cumulative gas used of all previous transactions added to the transaction’s contribution does not exceed the block gas limit&lt;/strong&gt;. Concretely, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;min(TX_MAX_GAS_LIMIT, tx.gas) &amp;lt;= execution_gas_available&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas &amp;lt;= state_gas_available&lt;/code&gt;, where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_gas_available = block_env.block_gas_limit - block_output.block_execution_gas_used&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_available = block_env.block_gas_limit - block_output.block_state_gas_used&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This check is performed before transaction inclusion in a block.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;intrinsic_gas&lt;/code&gt; is the state-independent intrinsic cost defined by &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;, charged entirely in execution-gas (base transaction cost, calldata, access lists, the recipient touch, value costs, and per-authorization base costs). It is the sole input to the transaction-validity check.&lt;/p&gt;

&lt;p&gt;All state-dependent charges — new account creation and &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; delegation costs — are no longer part of intrinsic gas. Per &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;, they are &lt;strong&gt;runtime charges&lt;/strong&gt; applied in the pre-execution phase, after the transaction is deemed valid but before the first EVM frame is entered.&lt;/p&gt;

&lt;h4 id=&quot;transaction-level-gas-accounting-reservoir-model&quot;&gt;Transaction-level gas accounting (reservoir model)&lt;/h4&gt;

&lt;p&gt;Since transactions have a single gas limit parameter (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas&lt;/code&gt;), gas accounting is enforced through a &lt;strong&gt;reservoir model&lt;/strong&gt;. The gas is split into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt;, and all gas counters are initialized, during the pre-execution phase defined by &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;. This phase occurs after the transaction has passed the intrinsic gas check but before the first EVM frame is entered.&lt;/p&gt;

&lt;p&gt;This EIP defines how the split and the counters are computed. The remaining accounting rules of the pre-execution phase (authorization processing, recipient warming, and the runtime account-creation and access charges) is specified in &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; are initialized as follows:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;evm_gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;intrinsic_gas&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;execution_gas_budget&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TX_MAX_GAS_LIMIT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;intrinsic_gas&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gas_left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execution_gas_budget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;evm_gas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;state_gas_reservoir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;evm_gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gas_left&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Because &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt; makes intrinsic gas state-independent, no state-gas component is subtracted from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas&lt;/code&gt; here and none is seeded into the reservoir. The state-dependent costs are applied as runtime charges — later in the pre-execution phase and during execution — drawing from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; first and from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; once the reservoir is exhausted.&lt;/p&gt;

&lt;p&gt;This means that the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; holds gas that exceeds &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt;’s budget. Additionally, four new counters are introduced:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt; encodes the total state-gas used by the transaction, and it is initialized as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used = 0&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; encodes how much of the current frame’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; has been drawn for state-gas charges and not yet credited back (i.e., the state-gas not covered by the reservoir). Like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;, it is frame-local: it is initialized to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; at the start of each call frame and is used to refill state-gas in last-in, first-out (LIFO) order.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_baseline&lt;/code&gt; records the value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; at the start of the state changes a frame’s rollback undoes, which for a call frame is its entry. Like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;, it is frame-local.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_committed&lt;/code&gt; records the part of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; that a frame’s rollback must not credit back to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;, because the state it paid for is not rolled back. Like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;, it is frame-local. Only the top-level frame uses it; in other frames it is always &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gas counters operate as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Execution-gas charges deduct from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; only.&lt;/li&gt;
  &lt;li&gt;State-gas charges deduct from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; first. When the reservoir is exhausted, the remainder deducts from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; and increments &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; by that remainder. State-gas charges increment &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;If a state creation is undone during execution, the corresponding amount of state-gas is &lt;strong&gt;refilled in last-in, first-out (LIFO) order&lt;/strong&gt;: because charges deduct from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; first and from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; last, refills credit the pool charged last (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;) first. It is credited to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; first (decrementing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; by the same amount) up to the current value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt;, and any remainder is credited to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt;. State-gas refills decrement &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt;. Throughout this specification, “refilling state-gas” refers to this LIFO operation.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; is passed to a child frame in full: the 63/64 rule applies to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; only. The parent keeps none of it while the child runs. On the child’s exit it becomes the parent’s again. Note: a refill in the child may have raised it above the amount passed in.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS&lt;/code&gt; opcode returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; only (excluding the reservoir).&lt;/li&gt;
  &lt;li&gt;State-gas is metered at the end of all state-mutating opcodes, call-frame boundaries (in case of exceptional halts and reverts) and at the end of the transaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;gas-accounting-for-sstore-opcode-level&quot;&gt;Gas accounting for SSTORE (opcode-level)&lt;/h5&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Original value&lt;/th&gt;
      &lt;th&gt;Current value&lt;/th&gt;
      &lt;th&gt;New value&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
      &lt;th&gt;State-gas charges/refills&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;x&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;Cleared slot, zero at transaction start&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_STORAGE_SET × CPSB&lt;/code&gt; refilled&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;x&lt;/td&gt;
      &lt;td&gt;New slot&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_STORAGE_SET × CPSB&lt;/code&gt; charged&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;x&lt;/td&gt;
      &lt;td&gt;x&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;Cleared slot, non-zero at transaction start&lt;/td&gt;
      &lt;td&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;x&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;x&lt;/td&gt;
      &lt;td&gt;Cleared slot restored to its original non-zero value&lt;/td&gt;
      &lt;td&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;x or 0&lt;/td&gt;
      &lt;td&gt;y&lt;/td&gt;
      &lt;td&gt;z&lt;/td&gt;
      &lt;td&gt;All other writes to an existing slot&lt;/td&gt;
      &lt;td&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;State-gas accounting for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; is performed at the end of the opcode execution.&lt;/p&gt;

&lt;h5 id=&quot;gas-accounting-for-new-accounts&quot;&gt;Gas accounting for new accounts&lt;/h5&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Operation&lt;/th&gt;
      &lt;th&gt;State-gas charges/refills&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt; with value to non-existent account&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; charged&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; with bytecode size of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;L&lt;/code&gt; to existent account&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;L × CPSB&lt;/code&gt; charged&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; with bytecode size of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;L&lt;/code&gt; to non-existent account&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(STATE_BYTES_PER_NEW_ACCOUNT + L) × CPSB&lt;/code&gt; charged&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; where balance transfer creates a new account&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; charged&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Here, an account is &lt;em&gt;existent&lt;/em&gt; if it already has a leaf in the state trie, i.e., it has a nonzero balance, a nonzero nonce, or non-empty code (per &lt;a href=&quot;/EIPS/eip-161&quot;&gt;EIP-161&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;In particular, an address that holds a balance but has no code and a zero nonce is existent and is a valid &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; target under &lt;a href=&quot;/EIPS/eip-684&quot;&gt;EIP-684&lt;/a&gt;. Creating a contract at such an address updates the existing leaf rather than adding a new one, so only the code-deposit cost (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;L × CPSB&lt;/code&gt;) applies and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; account-creation charge does not.&lt;/p&gt;

&lt;p&gt;State-gas accounting for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; operations is performed right before the respective call frame. In both families the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; account-creation charge is applied &lt;em&gt;conditionally&lt;/em&gt;: only when the operation is about to create a new account. The families differ only in &lt;em&gt;when&lt;/em&gt; the destination account may be read, which &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; constrains (see &lt;a href=&quot;#account-creation-charging-and-eip-7928&quot;&gt;Account-creation charging and EIP-7928&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt; family (conditional charge).&lt;/strong&gt; The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; account-creation charge is applied &lt;em&gt;conditionally&lt;/em&gt; right before entering the child frame: only when the target account does not exist and a positive value is transferred. If the operation is unsuccessful before entering the call frame (e.g., due to insufficient balance or due to the stack depth), or if the child frame reverts or halts exceptionally, the charged state-gas is refilled in LIFO order and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt; decreases by the same amount.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; family (conditional charge).&lt;/strong&gt; &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; defers reading the computed destination address until creation has passed the checks that precede any state access: sender balance for the endowment, nonce overflow, and the call-stack depth limit. A creation failing those checks never reads the destination, and no account-creation state-gas is charged. Once the checks pass, the destination is accessed — a single read that also performs the &lt;a href=&quot;/EIPS/eip-684&quot;&gt;EIP-684&lt;/a&gt; collision check:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If the destination is non-existent (per the existence rule above), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; is charged in the creating frame, before 63/64 of the remaining gas is forwarded: a portion drawn from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; reduces the gas forwarded to the create frame, and a failed charge exceptionally halts the creating frame — exactly as for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt;. If the destination pre-exists (e.g., it holds a balance), nothing is charged. The charge is decided by existence alone, independently of the collision outcome below.&lt;/li&gt;
  &lt;li&gt;On an address collision (&lt;a href=&quot;/EIPS/eip-684&quot;&gt;EIP-684&lt;/a&gt;) the creation fails as an exceptional halt of the create frame, consuming the forwarded gas. A colliding destination has a nonzero nonce or non-empty code, so it is existent and no account-creation state-gas was charged. A nonzero balance or non-empty storage alone does not cause a collision.&lt;/li&gt;
  &lt;li&gt;If the create frame reverts or halts exceptionally (including an address collision and a failed code deposit), the account creation is rolled back and any charged account-creation state-gas is refilled in LIFO order, decreasing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt; by the same amount — exactly as for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code-deposit portion (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;L × CPSB&lt;/code&gt;) is unaffected by this rule and is charged at code-deposit time as usual.&lt;/p&gt;

&lt;p&gt;The same conditional rule applies to top-level contract-creation transactions. Under &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt; the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; account-creation charge is not part of intrinsic gas and is not reserved up front; it is applied as a runtime charge in the pre-execution phase, when transaction setup accesses the deployment address (an access &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; always records), only if the destination does not already exist. Like any other state charge, it draws from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; first and from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; once the reservoir is exhausted. If the transaction reverts or halts (including an address collision), any charged portion is undone by the frame’s rollback, and the unspent reservoir is returned to the sender by the normal end-of-transaction settlement.&lt;/p&gt;

&lt;p&gt;Charges for account creation with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; are charged at the point where it executes.&lt;/p&gt;

&lt;h5 id=&quot;gas-refills-for-selfdestruct&quot;&gt;Gas refills for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;&lt;/h5&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; for accounts created in the same transaction does not produce increases in state size as the account, its data and its storage is not included in the state trie. However, this operation does not produce any state-gas refills and there are no changes to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For an account that existed before the transaction, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; only transfers its balance and the account is not removed. Thus, no state-gas refill applies and no changes to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt;. This is consistent with the behavior of &lt;a href=&quot;/EIPS/eip-6780&quot;&gt;EIP-6780&lt;/a&gt;.&lt;/p&gt;

&lt;h5 id=&quot;gas-accounting-for-halts-and-reverts&quot;&gt;Gas accounting for halts and reverts&lt;/h5&gt;

&lt;p&gt;A call frame’s state changes are rolled back on both reverts and exceptional halts. In both cases the frame’s state-gas is restored to its baseline rather than refilled:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;net_state_gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state_gas_baseline&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state_gas_reservoir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state_gas_from_gas_left&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;evm_state_gas_used&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;net_state_gas&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gas_left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state_gas_from_gas_left&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;state_gas_from_gas_left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;state_gas_reservoir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state_gas_baseline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net_state_gas&lt;/code&gt; is negative for a frame that refilled more than it charged, so &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt; increases: the rollback also restores the state whose removal the refill credited. The restore assigns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; where a refill credits it, so it is applied before any refill its parent makes for the failed operation. The two cases differ only in how the frame’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; is treated, exactly as in existing EVM semantics.&lt;/p&gt;

&lt;p&gt;Only the top-level frame can have a baseline that is not its entry, and only when the transaction has &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorizations. Its rollback does not undo the authorizations applied in the pre-execution phase (&lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;), so the state-gas charged for them must not be refilled. The baseline is taken after the authorization charges and before the account-creation charge for the transaction’s target, so that charge is refilled. At this point the frame commits the state-gas charged so far:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;state_gas_committed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state_gas_from_gas_left&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;state_gas_baseline&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state_gas_reservoir&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;state_gas_from_gas_left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note: A commit moves no gas and does not change &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt;. It marks the state-gas as not refillable, so the rollback above does not credit it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If the transaction fails before the top-level frame is entered, the pre-execution phase is rolled back, including the authorizations (&lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;). All state-gas charged in that phase is refilled: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_committed&lt;/code&gt; are both credited to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_baseline&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; are set back to the values they had at the start of the transaction.&lt;/p&gt;

&lt;p&gt;When a child frame &lt;strong&gt;succeeds&lt;/strong&gt;, its remaining &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; is returned to the parent and its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; is added to the parent’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; (the state-gas it funded from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; persists and is now backed by the merged &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;). Then, with the child’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; merged in, the frame returns state-gas to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;, up to the amount it has outstanding:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state_gas_reservoir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state_gas_from_gas_left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gas_left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;state_gas_reservoir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;state_gas_from_gas_left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note: this undoes no state creation, so &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt; is unchanged. It only moves gas between the two pools.&lt;/p&gt;

&lt;p&gt;This step is needed because a refill may happen in a different frame than the matching charge. The original value in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; table above is the value at transaction start, not at frame entry. A frame may therefore clear a slot allocated by an earlier frame. Its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; may be smaller than the refill, and the rest goes to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt;, although the charge drew from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;. The step moves it up on every merge, to the first frame with an outstanding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt;. If it reaches the top-level frame, it stays in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; and is returned to the sender by the end-of-transaction settlement.&lt;/p&gt;

&lt;p&gt;The step applies to successful children only. This requires that a frame that reverts or halts exceptionally returns no state-gas to its parent; the restore to the frame’s baseline above provides that. Otherwise the parent receives state-gas for a slot the rollback restored, and a later merge moves it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When a child frame &lt;strong&gt;reverts&lt;/strong&gt;, all of its state changes are rolled back, its state-gas is restored as above, and its resulting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; (including the credited &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt;) is returned to the parent.&lt;/p&gt;

&lt;p&gt;When a child frame &lt;strong&gt;halts exceptionally&lt;/strong&gt;, the same restore is applied, but the child’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; is consumed (set to zero) rather than returned, so the credited &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; is consumed with it.&lt;/p&gt;

&lt;p&gt;The same rules apply when the top-level call frame reverts or halts, treating the frame as a child of the transaction boundary. In particular, for address collisions in contract-creation transactions, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; is consumed in full. The colliding destination has a nonzero nonce or non-empty code (&lt;a href=&quot;/EIPS/eip-684&quot;&gt;EIP-684&lt;/a&gt;), so no account-creation state-gas was charged. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; is returned to the sender by the normal end-of-transaction settlement.&lt;/p&gt;

&lt;h5 id=&quot;gas-accounting-for-eip-7702-authorizations&quot;&gt;Gas accounting for &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorizations&lt;/h5&gt;

&lt;p&gt;Gas charges for &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorizations follow the specification in &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;pre-state-and-post-state-gas-validation&quot;&gt;Pre-state and post-state gas validation&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; defines two-phase gas validation for state-accessing opcodes: pre-state costs (determinable without state access) and post-state costs (requiring state access). Under this EIP, the execution-gas portion of these opcodes follows the &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; rules unchanged and is charged at opcode time against &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;. The state-gas portion is also charged at the opcode level, with the timing given for each opcode above.&lt;/p&gt;

&lt;p&gt;For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt;, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CALL_STIPEND&lt;/code&gt; pre-state check (&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;) applies to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; only, excluding the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;transaction-gas-used&quot;&gt;Transaction gas used&lt;/h4&gt;

&lt;p&gt;At the end of transaction execution, the gas used before and after refunds is defined as:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;tx_gas_used_before_refund&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gas_left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state_gas_reservoir&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tx_gas_refund&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_gas_used_before_refund&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;refund_counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tx_gas_used_after_refund&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_gas_used_before_refund&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_gas_refund&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tx_gas_used&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_gas_used_after_refund&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calldata_floor_gas_cost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The refund cap remains at 20% of gas used. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx_gas_used&lt;/code&gt; applies the &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt; calldata floor after refunds, so the floor can effectively negate part of a refund when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calldata_floor_gas_cost &amp;gt; tx_gas_used_after_refund&lt;/code&gt;. The receipt &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cumulative_gas_used&lt;/code&gt; uses this post-floor value.&lt;/p&gt;

&lt;h4 id=&quot;block-level-gas-accounting&quot;&gt;Block-level gas accounting&lt;/h4&gt;

&lt;p&gt;At block level, instead of tracking a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_used&lt;/code&gt; counter, we keep track of two counters, one for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state-gas&lt;/code&gt; and one for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution-gas&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;tx_state_gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;evm_state_gas_used&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tx_execution_gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_gas_used_after_refund&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_state_gas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calldata_floor_gas_cost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;block_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_execution_gas_used&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_execution_gas&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;block_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_state_gas_used&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_state_gas&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since all state-gas charges are now applied as runtime or execution-time charges (per &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;), the transaction’s total state-gas is fully captured by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt;; there is no separate intrinsic state-gas term to add.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt; calldata floor participates in block accounting through the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max&lt;/code&gt; term, applied to the execution-gas dimension: calldata is an execution-gas resource, and the floor’s bound on worst-case block size holds only if a data-heavy transaction contributes at least the floor to the block’s gas accounting. The floor is compared against the transaction’s execution-gas portion alone — not the transaction total — so execution gas may absorb the floor exactly as under &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt;, while state-gas spending cannot (see &lt;a href=&quot;#calldata-floor-in-block-accounting&quot;&gt;Calldata floor in block accounting&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The block header &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_used&lt;/code&gt; field is set to:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gas_used&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_execution_gas_used&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_state_gas_used&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The block validity condition uses this value:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;assert&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gas_used&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gas_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;invalid block: too much gas used&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The base fee update rule is also modified accordingly:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gas_used_delta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gas_used&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gas_target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h5 id=&quot;integration-with-eip-7778&quot;&gt;Integration with &lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt;&lt;/h5&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt; excludes transaction refunds from block gas accounting. The refunds in question are those of the transaction refund counter — a execution-gas quantity. State-gas refills are not refunds in this sense: a refill reverses a charge for state that was never durably created (a reverted or exceptionally halted frame, a failed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;, or a slot set and reset within the same transaction), so the resource metered by the state-gas dimension was never consumed. Refills therefore remain netted into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_state_gas_used&lt;/code&gt; regardless of &lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt;, and only the execution-gas dimension changes (see &lt;a href=&quot;#state-gas-refills-under-eip-7778&quot;&gt;State-gas refills under EIP-7778&lt;/a&gt;). If implemented together with &lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt;, the block level would be updated to:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;tx_state_gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;evm_state_gas_used&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tx_execution_gas&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_gas_used_before_refund&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_state_gas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calldata_floor_gas_cost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;block_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_execution_gas_used&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_execution_gas&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;block_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block_state_gas_used&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tx_state_gas&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max&lt;/code&gt; term preserves &lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt;’s block accounting rule &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block.gas_used += max(tx_gas_used, calldata_floor_gas_cost)&lt;/code&gt;, applied here to the execution-gas dimension.&lt;/p&gt;

&lt;h4 id=&quot;receipt-semantics&quot;&gt;Receipt semantics&lt;/h4&gt;

&lt;p&gt;Receipt &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cumulative_gas_used&lt;/code&gt; tracks the cumulative sum of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx_gas_used&lt;/code&gt; (post-refund, post-floor) across transactions, instead of the block’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_used&lt;/code&gt;. This means &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;receipt[i].cumulative_gas_used - receipt[i-1].cumulative_gas_used&lt;/code&gt; equals the gas paid by transaction &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;system-contracts-and-system-transactions&quot;&gt;System contracts and system transactions&lt;/h3&gt;

&lt;p&gt;The gas limit of system contracts (e.g., &lt;a href=&quot;/EIPS/eip-2935&quot;&gt;EIP-2935&lt;/a&gt;, &lt;a href=&quot;/EIPS/eip-4788&quot;&gt;EIP-4788&lt;/a&gt;, &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt;, &lt;a href=&quot;/EIPS/eip-7251&quot;&gt;EIP-7251&lt;/a&gt;) that are invoked at the start of every block via a system call is updated from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;30M&lt;/code&gt; to:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;SYSTEM_CALL_GAS_LIMIT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;30_000_000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;STATE_BYTES_PER_STORAGE_SET&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;×&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CPSB&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;×&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SYSTEM_MAX_SSTORES_PER_CALL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This ensures preservation of the existing execution margin for system contracts under higher state creation costs.&lt;/p&gt;

&lt;p&gt;Here, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYSTEM_MAX_SSTORES_PER_CALL = 16&lt;/code&gt; is the upper bound on the number of new storage slots a single system call is expected to write. It is a margin rather than a bound derived from any particular system contract, and must be re-derived if a system call can write more new slots.&lt;/p&gt;

&lt;p&gt;The additional &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_STORAGE_SET × CPSB × SYSTEM_MAX_SSTORES_PER_CALL&lt;/code&gt; is placed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; while the rest of the system call’s gas is placed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;. System calls remain not subject to the &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_GAS_LIMIT&lt;/code&gt; cap, do not count against the block gas limit, and do not contribute to either &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_execution_gas_used&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_state_gas_used&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;deriving-the-cost-per-state-byte-cpsb&quot;&gt;Deriving the cost per state byte (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt;)&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; is a fixed parameter derived from a reference block gas limit. The derivation pins the cost so that, at the reference block gas limit and under expected average utilization, total state growth stays at the target rate. If a future block gas limit increase materially changes the expected state growth rate, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; can be re-derived in a subsequent EIP.&lt;/p&gt;

&lt;h4 id=&quot;inputs&quot;&gt;Inputs&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Target state growth&lt;/strong&gt;: 120 GiB per year, i.e., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;120 × 2^30 = 128,849,018,880&lt;/code&gt; bytes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reference block gas limit&lt;/strong&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;150M&lt;/code&gt; gas units.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Slot time&lt;/strong&gt;: 12 seconds, giving &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;86400 / 12 = 7,200&lt;/code&gt; blocks per day and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;7,200 × 365 = 2,628,000&lt;/code&gt; blocks per year.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Average state-gas utilization&lt;/strong&gt;: 50% of the block gas limit. Under multidimensional metering, the base fee converges to the target, which is half of the gas limit. On average, half of each block’s gas budget can therefore be consumed by state-gas charges before the base fee starts pushing back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;derivation&quot;&gt;Derivation&lt;/h4&gt;

&lt;p&gt;The total state gas available for state creation in a year is:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;total_state_gas_per_year = (gas_limit / 2) × blocks_per_year
                         = (150,000,000 / 2) × 2,628,000
                         = 75,000,000 × 2,628,000
                         = 1.971 × 10^14 gas
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dividing by the target byte count gives the cost per state byte:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CPSB = total_state_gas_per_year / target_state_growth
     = 1.971 × 10^14 / 128,849,018,880
     ≈ 1530 gas/byte
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;why-target-a-150m-block-limit&quot;&gt;Why target a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;150M&lt;/code&gt; block limit?&lt;/h4&gt;

&lt;p&gt;The reference block gas limit of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;150M&lt;/code&gt; is chosen as a middle ground between the current &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;60M&lt;/code&gt; and the expected future &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;300M&lt;/code&gt;. This allows us to set a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; that is not too high (which would cause a large immediate increase in state creation costs) nor too low (which would require a more aggressive increase in a future EIP when the block limit increases further).&lt;/p&gt;

&lt;p&gt;With this target, we expect state growth will slow down significantly compared to the current trajectory and then increase again as we slowly increase the block gas limit.&lt;/p&gt;

&lt;h4 id=&quot;why-target-120-gib-per-year&quot;&gt;Why target 120 GiB per year?&lt;/h4&gt;

&lt;p&gt;By targeting a state growth of 120 GiB per year with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;150M&lt;/code&gt; block limit, we achieve the following worst-case growth rate at different block limits:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Block limit&lt;/th&gt;
      &lt;th&gt;Worst-case growth rate&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;100M&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;80 GiB/year&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;150M&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;120 GiB/year&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;200M&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;160 GiB/year&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;250M&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;200 GiB/year&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;300M&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;240 GiB/year&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;These rates are computed assuming blocks are fully utilized with state creation operations, which is a worst-case scenario. Assuming a smooth increase in block limit from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;100M&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;300M&lt;/code&gt; over the next year, we would expect a worst-case average growth rate of around 160 GiB per year, which is a significant improvement over the current trajectory.&lt;/p&gt;

&lt;h3 id=&quot;harmonization-across-state-creation&quot;&gt;Harmonization across state creation&lt;/h3&gt;

&lt;p&gt;With the current pricing, the gas cost of creating 1 byte of state varies depending on the method used. The following table shows the various methods and their gas cost per byte. The calculation ignores the transaction intrinsic cost (21,000 gas units) and the costs of additional opcodes and scaffolding needed to execute such a transaction.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Method&lt;/th&gt;
      &lt;th&gt;What is written&lt;/th&gt;
      &lt;th&gt;Intrinsic gas&lt;/th&gt;
      &lt;th&gt;Bytes → state&lt;/th&gt;
      &lt;th&gt;Gas / byte&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Deploy 24 kB contract (&lt;a href=&quot;/EIPS/eip-170&quot;&gt;EIP-170&lt;/a&gt; limit)&lt;/td&gt;
      &lt;td&gt;Runtime code + account trie node&lt;/td&gt;
      &lt;td&gt;32,000 CREATE + 200 × 24,576 code deposit = 4,947,200 gas&lt;/td&gt;
      &lt;td&gt;24,696 B&lt;/td&gt;
      &lt;td&gt;~200 gas&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Fund fresh EOA with 1 wei&lt;/td&gt;
      &lt;td&gt;Updated account leaf&lt;/td&gt;
      &lt;td&gt;25,000 new account&lt;/td&gt;
      &lt;td&gt;~120 B&lt;/td&gt;
      &lt;td&gt;~208 gas&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Add delegate flag to funded EOA (&lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt;)&lt;/td&gt;
      &lt;td&gt;23 B (0xef0100‖address) + updated account leaf&lt;/td&gt;
      &lt;td&gt;25,000 PER_EMPTY_ACCOUNT + 12,500 PER_AUTH_BASE + 1,616 calldata - 7,823 refund = ~31,300 gas&lt;/td&gt;
      &lt;td&gt;~143 B&lt;/td&gt;
      &lt;td&gt;~219 gas&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorization to empty address&lt;/td&gt;
      &lt;td&gt;23 B (0xef0100‖address) + updated account leaf&lt;/td&gt;
      &lt;td&gt;25,000 PER_EMPTY_ACCOUNT + 12,500 PER_AUTH_BASE + 1,616 calldata = 39,116 gas&lt;/td&gt;
      &lt;td&gt;~143 B&lt;/td&gt;
      &lt;td&gt;~274 gas&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Fill new storage slots (SSTORE 0→x)&lt;/td&gt;
      &lt;td&gt;Slot in storage trie&lt;/td&gt;
      &lt;td&gt;20,000 gas/slot&lt;/td&gt;
      &lt;td&gt;64 B&lt;/td&gt;
      &lt;td&gt;~313 gas&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;To harmonize costs, we first set the gas cost of a single state byte, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt;, as explained above. Now that we have a standardized cost per byte, we can derive the various costs parameters by multiplying the unit cost by the increase in bytes any given operation creates in the database (i.e., 64 bytes per slot, 120 bytes per account and 23 bytes per authorization).&lt;/p&gt;

&lt;p&gt;Note that the fixed cost &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt; for contract deployments assumes the same cost as a new account creation.&lt;/p&gt;

&lt;h4 id=&quot;deriving-byte-size-for-new-slots-and-accounts&quot;&gt;Deriving byte size for new slots and accounts&lt;/h4&gt;

&lt;p&gt;The byte sizes used in this proposal correspond to the on-disk footprint of a new account or storage slot, taking into account both the leaf data and the key under which it is stored.&lt;/p&gt;

&lt;p&gt;A new account adds 120 bytes:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Field&lt;/th&gt;
      &lt;th&gt;Size&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Account hash (key)&lt;/td&gt;
      &lt;td&gt;32 bytes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Nonce&lt;/td&gt;
      &lt;td&gt;8 bytes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Balance&lt;/td&gt;
      &lt;td&gt;16 bytes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Code hash&lt;/td&gt;
      &lt;td&gt;32 bytes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Storage root&lt;/td&gt;
      &lt;td&gt;32 bytes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;120 bytes&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;A new storage slot adds 64 bytes:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Field&lt;/th&gt;
      &lt;th&gt;Size&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Slot hash (key)&lt;/td&gt;
      &lt;td&gt;32 bytes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Value&lt;/td&gt;
      &lt;td&gt;32 bytes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;64 bytes&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;For &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorizations on an already-existing account, no new account leaf is created. The only new state written is the delegation indicator stored in the authority’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code&lt;/code&gt; field. As specified in &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt;, this indicator is the 3-byte magic prefix &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xef0100&lt;/code&gt; concatenated with the 20-byte delegate address, for a total of 23 bytes:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Field&lt;/th&gt;
      &lt;th&gt;Size&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Delegation magic (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xef0100&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;3 bytes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Delegate address&lt;/td&gt;
      &lt;td&gt;20 bytes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;23 bytes&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;When the authorization targets a non-existent account, the full &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT&lt;/code&gt; is charged in addition to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_AUTH_BASE&lt;/code&gt;, since both a new account leaf and the delegation indicator are written.&lt;/p&gt;

&lt;p&gt;These figures account only for the leaf payload and its keccak256 key. They do not include the additional trie overhead (intermediate nodes, encoding, etc.) incurred when the new entry is inserted. The values are therefore a lower bound on the actual state growth per operation.&lt;/p&gt;

&lt;h3 id=&quot;multidimensional-metering&quot;&gt;Multidimensional metering&lt;/h3&gt;

&lt;h4 id=&quot;eip-7825-limit-on-contract-size&quot;&gt;EIP-7825 limit on contract size&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt; introduces &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_GAS_LIMIT&lt;/code&gt; (16.7M) as the maximum gas for a single transaction, in particular stipulating &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas &amp;lt;= TX_MAX_GAS_LIMIT&lt;/code&gt; as a validity condition. Were we to continue enforcing this validity condition, with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB = 1530&lt;/code&gt;, this proposal would limit the maximum contract size that can be deployed to roughly 7.5kB. Assuming a representative constructor execution budget of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5M&lt;/code&gt; execution gas on top of the 21,000 base transaction cost and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; account-creation cost, the remaining budget for code-deposit state gas yields $\frac{16,777,216 - 21,000 - 5,000,000 - 120 \times 1530}{1530} \approx 7{,}564$ bytes. This maximum size would only decrease if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; is re-derived upward in a future EIP.&lt;/p&gt;

&lt;p&gt;To solve this issue, we only apply this gas limit to execution gas, not state gas. Doing so does not weaken the intended scaling effect of &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt;, because execution gas meters all resources that benefit from parallelization. In particular, state growth does not: growing the state always requires writing to disk, an operation that can be parallelized, but crucially this part of the cost of a state growth operation has to be metered in execution gas, not state gas. In other words, any operation that grows the state should consume both execution gas and state gas, and the execution gas should fully account for all costs other than the long term effect of growing the state.&lt;/p&gt;

&lt;p&gt;However, we cannot statically enforce an execution gas consumption of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_GAS_LIMIT&lt;/code&gt;, while still allowing a higher state gas consumption, because transactions only have a single gas limit parameter, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas&lt;/code&gt;. This is solved through a &lt;strong&gt;reservoir model&lt;/strong&gt;: at transaction start, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evm_gas&lt;/code&gt; is split into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; (capped at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_GAS_LIMIT - intrinsic_gas&lt;/code&gt;) and a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt; (the overflow). State gas charges draw from the reservoir first, then from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; when the reservoir is empty. Execution gas charges draw from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; only. Exceeding the execution gas budget behaves identically to running out of gas — no special error is needed.&lt;/p&gt;

&lt;p&gt;State-gas refills are applied in last-in, first-out (LIFO) order: because charges draw from the reservoir first and from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; last, refills credit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; first (up to the gas it borrowed, tracked by the frame-local &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; counter), then the reservoir. Undoing a state creation therefore restores the exact pools the charge drew from, as long as both happen in the same frame. Because the original value in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; table above is the value at transaction start rather than at frame entry, a refill may land in a frame other than the one that was charged; the counter is frame-local, so the gas then stays in the reservoir while the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; that funded the charge stays reduced. Returning it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; on the merge keeps the two pools from drifting into one another: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; is never inflated beyond &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_GAS_LIMIT - intrinsic_gas&lt;/code&gt;, and state-gas is not left in the reservoir while a frame is still owed it. The same mismatch is why LIFO order alone does not make a frame’s rollback correct: a frame may credit a refill it never funded, so rollback is specified as a restore to the frame’s baseline (see &lt;a href=&quot;#gas-accounting-for-halts-and-reverts&quot;&gt;Gas accounting for halts and reverts&lt;/a&gt;).&lt;/p&gt;

&lt;h4 id=&quot;keeping-an-absolute-transaction-gas-limit&quot;&gt;Keeping an absolute transaction gas limit&lt;/h4&gt;

&lt;p&gt;Applying &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt;’s cap to execution-gas alone would leave &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas&lt;/code&gt; itself bounded only by the block gas limit. That is not the intent of this proposal: a per-transaction gas limit is worth keeping. &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt; introduced one so that the work a single transaction can represent stays a small and predictable unit for proving, parallel execution, and scheduling, and so that this bound is fixed by the protocol rather than drifting upward with every block gas limit increase. This proposal raises that limit for the state dimension; it does not abolish it.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas&lt;/code&gt; is therefore capped at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_TOTAL_GAS_LIMIT&lt;/code&gt;, which keeps every transaction’s gas limit within an unsigned 32-bit integer. The bound is chosen to sit far above the deployments this proposal sets out to enable. Reusing the figures above (the 21,000 base transaction cost, a representative &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5M&lt;/code&gt; execution gas constructor budget, and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; account-creation cost), the code-deposit budget it leaves is $\frac{2^{32} - 1 - 21,000 - 5,000,000 - 120 \times 1530}{1530} \approx 2{,}803{,}766$ bytes, roughly 2.8 MB and about 43 times &lt;a href=&quot;/EIPS/eip-7954&quot;&gt;EIP-7954&lt;/a&gt;’s 65,536-byte contract size limit, so a single transaction can still deploy dozens of maximum-size contracts. While the block gas limit stays below &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_TOTAL_GAS_LIMIT&lt;/code&gt;, the per-dimension block checks are the tighter bound and the cap rejects nothing that could be included today; what it adds is a ceiling that no later block gas limit increase can lift.&lt;/p&gt;

&lt;h4 id=&quot;higher-throughput&quot;&gt;Higher throughput&lt;/h4&gt;

&lt;p&gt;Another advantage of metering contract creation separately is that increasing the cost of state creation operation in line with the block limit will not affect the available gas for other operations. This allows for higher throughput.&lt;/p&gt;

&lt;h4 id=&quot;calldata-floor-in-block-accounting&quot;&gt;Calldata floor in block accounting&lt;/h4&gt;

&lt;p&gt;The &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt; calldata floor (raised further by &lt;a href=&quot;/EIPS/eip-7976&quot;&gt;EIP-7976&lt;/a&gt;) bounds worst-case block size only because it participates in block gas accounting: a data-heavy transaction must occupy at least the floor’s worth of the block gas limit, which is also what &lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt; preserves with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max(tx_gas_used, calldata_floor_gas_cost)&lt;/code&gt;. Omitting the floor from the two-dimensional accounting would let such a transaction pay the floor while contributing only its pre-floor gas to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_execution_gas_used&lt;/code&gt;, re-expanding the maximum bytes per block by the ratio of floor to standard calldata pricing and hiding the difference from the base-fee update. The transaction-validity check &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max(intrinsic_gas, calldata_floor_gas_cost) &amp;lt;= TX_MAX_GAS_LIMIT&lt;/code&gt; does not provide this bound: it caps a single transaction’s calldata against the &lt;a href=&quot;/EIPS/eip-7825&quot;&gt;EIP-7825&lt;/a&gt; transaction limit but contributes nothing to the block’s cumulative counters, so a block could otherwise be filled with individually valid transactions whose floors were paid but never counted.&lt;/p&gt;

&lt;p&gt;The floor is compared against the transaction’s execution-gas portion (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx_gas_used_after_refund - tx_state_gas&lt;/code&gt;, or the before-refund equivalent under &lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt;) rather than the transaction total. This is the per-dimension restatement of &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt;’s existing rule, not a new restriction. Under single-dimensional accounting, gas spent on execution may absorb the floor, and this is sound because the absorbing gas occupies the very block budget the floor protects: with or without the floor binding, a transaction carrying &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B&lt;/code&gt; calldata bytes occupies at least the floor’s worth of block gas, which is the invariant that bounds bytes per block. Execution gas retains exactly this absorbing role here.&lt;/p&gt;

&lt;p&gt;What the per-dimension comparison rules out is absorption &lt;em&gt;across&lt;/em&gt; dimensions. State-gas occupies the state dimension’s separate budget, so under a transaction-total comparison (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max(tx_gas_used_after_refund, calldata_floor_gas_cost) - tx_state_gas&lt;/code&gt;) a transaction padded with state creation would enter its calldata into the execution dimension below the floor rate. The bytes-per-block bound would then no longer be a property of the execution dimension: it would hold only to the extent that the padding fills the state dimension, making the effective calldata bound a function of the state-gas schedule (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; and the per-item byte sizes) and silently weakening it whenever that schedule is re-derived. The per-dimension comparison keeps the bound unconditional and independent of state-gas pricing.&lt;/p&gt;

&lt;p&gt;A consequence of the per-dimension comparison is that the sum of a transaction’s block-accounted gas across dimensions can exceed the gas its sender pays; this is intentional — block accounting bounds resource consumption per dimension, while the payment rule remains the transaction-level floor of &lt;a href=&quot;/EIPS/eip-7623&quot;&gt;EIP-7623&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;state-gas-refills-under-eip-7778&quot;&gt;State-gas refills under &lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt; counts refunds toward block gas because a refund rebates work that was actually performed: a refunded &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; executed and its computational cost was real, so the rebate is an incentive, not evidence of less work. A state-gas refill is the opposite case. State-gas meters durable state growth, and a refill fires only when that growth is undone — the resource the dimension meters was never consumed. Counting gross (pre-refill) state-gas would make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_state_gas_used&lt;/code&gt; overstate actual state growth and invalidate the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; derivation, which assumes the block’s state-gas approximates bytes written to state. There is no smuggling vector in excluding refills: the transient computation of rolled-back operations remains fully counted, since their execution-gas charges stay consumed and, under &lt;a href=&quot;/EIPS/eip-7778&quot;&gt;EIP-7778&lt;/a&gt;, are counted before refunds.&lt;/p&gt;

&lt;h3 id=&quot;account-creation-charging-and-eip-7928&quot;&gt;Account-creation charging and &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; (Block-Level Access Lists) constrains &lt;em&gt;when&lt;/em&gt; the target address of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; may be accessed: only once the EVM reaches the computed address (on post-access out-of-gas, on creation collision, or when creation setup increments the new account’s nonce), and not on address computation alone, nor when creation fails before access (e.g., insufficient sender balance for the endowment, nonce overflow, or the call-stack depth limit).&lt;/p&gt;

&lt;p&gt;The conditional account-creation charge is compatible with this by construction. The existence read that decides the charge is the &lt;em&gt;same single access&lt;/em&gt; that performs the &lt;a href=&quot;/EIPS/eip-684&quot;&gt;EIP-684&lt;/a&gt; collision check, and it happens after the pre-access failure checks — exactly the access &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; already sanctions and records. Creations that fail before access charge nothing and appear nowhere in the block access list; creations that reach the access point are recorded and pay exactly for the state they are about to create. The recorded access set is identical to that of an unconditional-charge design: the charge decision introduces no additional read.&lt;/p&gt;

&lt;p&gt;An earlier revision of this EIP instead charged the account-creation portion unconditionally before the create frame (before the balance, nonce, and depth checks) and refilled it on frame exit when the destination pre-existed or creation failed. The conditional model was adopted because it removes the pre-existing-destination refill and the pre-access-failure refills (nothing was charged), aligns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt; family (state-dependent charges are applied when the state is read, conditionally on what is actually created), and avoids temporarily under-budgeting the create frame of a deployment onto a pre-existing account (e.g., a pre-funded deterministic-deployment address). The remaining refill — on failure of the create frame — is shared with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt;. At the transaction level the account-creation charge is not part of intrinsic gas at all: per &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt; it is a runtime charge, so transaction validity remains decidable without any state access while the charge is metered only when the state is actually accessed.&lt;/p&gt;

&lt;p&gt;Placement of the charge among the remaining alternatives:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Why not charge after the create frame exits?&lt;/strong&gt; Up to 63/64 of the parent’s execution gas is forwarded to the child, and deployment code may legitimately consume nearly all of it. Deferring the charge until the frame returns could make an otherwise-successful deployment fail with out-of-gas at frame exit, introducing semantic uncertainty.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Why not charge inside the create frame?&lt;/strong&gt; That would silently move the out-of-gas condition from the parent frame (the pre-existing behavior for account-creation charges) to the child frame. Charging in the creating frame, right after the destination access and before the 63/64 split, keeps the out-of-gas locus and the forwarded-gas computation identical to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt; family.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL*&lt;/code&gt; family the charge remains conditional and is unchanged: the callee is already resolved (including &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; delegation resolution) before the child frame, so there is no deferred-access conflict, and unconditionally pre-charging every call would create significant compatibility concerns (e.g., Solidity’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;address.transfer()&lt;/code&gt; forwards no gas to the child frame).&lt;/p&gt;

&lt;p&gt;A remaining gap is value-bearing &lt;em&gt;normal transactions&lt;/em&gt; to an empty account, which trigger account creation but are not currently charged for it. This is addressed by &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;, which adds the account-creation cost to the intrinsic gas of such transactions (see &lt;a href=&quot;#pricing-mismatch-with-respect-to-eth-transfers&quot;&gt;Pricing mismatch with respect to ETH transfers&lt;/a&gt;).&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This is a backwards-incompatible gas repricing that requires a scheduled network upgrade.&lt;/p&gt;

&lt;p&gt;Wallet developers and node operators MUST update gas estimation handling to accommodate the new state creation costs and the two-dimensional metering model. Specifically:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Wallets: Wallets using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth_estimateGas&lt;/code&gt; MUST be updated to ensure they correctly account for the updated state creation costs and report &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas&lt;/code&gt; covering both the execution-gas and state-gas dimensions. Failure to do so could result in underestimating gas, leading to failed transactions.&lt;/li&gt;
  &lt;li&gt;Node Software: RPC methods such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth_estimateGas&lt;/code&gt; MUST incorporate the new state-gas charges, the reservoir-model accounting, and the two-dimensional block accounting when computing gas estimates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users can maintain their usual workflows without modification, as wallet and RPC updates will handle these changes.&lt;/p&gt;

&lt;p&gt;Contracts and tools measuring work as the difference between two &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS&lt;/code&gt; reads can get a negative result. This EIP makes it possible both within a frame and across a call (see &lt;a href=&quot;#gas_left-can-increase&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; can increase&lt;/a&gt;). Contracts already deployed with such metering cannot be fixed.&lt;/p&gt;

&lt;h3 id=&quot;deterministic-deployment-factories&quot;&gt;Deterministic deployment factories&lt;/h3&gt;

&lt;p&gt;Some well-known deterministic deployment factories are deployed via pre-signed transactions with a hardcoded gas limit. The classic Nick’s method factory, for instance, uses a pre-signed transaction with a 100,000 gas limit. Under this EIP, the state creation cost of deploying these factories increases beyond their hardcoded gas limit, so the original pre-signed deployment transactions will no longer execute successfully. The same applies to other deterministic deployer contracts such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SingletonFactory&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Create2Deployer&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ImmutableCreate2Factory&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CreateX&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This does not affect existing networks where these factories are already deployed, including mainnet and L2s (which maintain their own gas schedules). The impact is limited to new networks (e.g., devnets and testnets) that activate this EIP from genesis and have not yet deployed these factories. On such networks, the pre-signed deployment transactions must be regenerated with an updated gas limit, or the factories must be pre-deployed at genesis. Tooling that relies on these factories being available at their canonical addresses SHOULD ensure they are deployed before use.&lt;/p&gt;

&lt;h3 id=&quot;estimated-price-impacts&quot;&gt;Estimated price impacts&lt;/h3&gt;

&lt;p&gt;Users and dApp developers will experience an increase in transaction costs associated with creating a new state. The next table summarizes the state-gas portion of state creation costs for common operations under the proposed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt; of 1,530. Additional execution-gas charges (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt;, hash cost) defined in &lt;a href=&quot;/EIPS/eip-8038&quot;&gt;EIP-8038&lt;/a&gt; apply on top.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Case&lt;/th&gt;
      &lt;th&gt;Current gas cost&lt;/th&gt;
      &lt;th&gt;Proposed gas cost&lt;/th&gt;
      &lt;th&gt;Gas cost increase&lt;/th&gt;
      &lt;th&gt;Proposed cost (ETH)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;New account&lt;/td&gt;
      &lt;td&gt;25,000&lt;/td&gt;
      &lt;td&gt;183,600&lt;/td&gt;
      &lt;td&gt;~7×&lt;/td&gt;
      &lt;td&gt;0.0000147&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;New slot&lt;/td&gt;
      &lt;td&gt;20,000&lt;/td&gt;
      &lt;td&gt;97,920&lt;/td&gt;
      &lt;td&gt;~5×&lt;/td&gt;
      &lt;td&gt;0.00000783&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;24 kB contract deployment&lt;/td&gt;
      &lt;td&gt;4,947,200&lt;/td&gt;
      &lt;td&gt;37,784,880&lt;/td&gt;
      &lt;td&gt;~8×&lt;/td&gt;
      &lt;td&gt;0.00302&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The “Proposed cost (ETH)” column assumes a base fee of 0.08 Gwei, which corresponds to the average base fee observed after the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;60M&lt;/code&gt; gas increase in December 2025 and January 2026.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;Increasing the cost of state creation operations could impact the usability of certain applications. More analysis is needed to understand the potential effects on various dApps and user behaviors.&lt;/p&gt;

&lt;h3 id=&quot;pricing-mismatch-with-respect-to-eth-transfers&quot;&gt;Pricing mismatch with respect to ETH transfers&lt;/h3&gt;

&lt;p&gt;One potential concern is the cost of creating a new account (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_NEW_ACCOUNT × CPSB&lt;/code&gt; gas units, e.g., 183,600 at the proposed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CPSB&lt;/code&gt;), compared to transferring ETH to a fresh account (21,000 gas units). With this mismatch, users wishing to create a new account are incentivized to first send a normal transaction (costing 21,000) to this account to create it, thus avoiding the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; charge.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt; solves this mismatch by adding a new component to the intrinsic gas cost of transactions. If a non-create transaction has value &amp;gt; 0 and targets a non-existent account, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; is added to intrinsic cost.&lt;/p&gt;

&lt;h3 id=&quot;added-complexity-in-block-building&quot;&gt;Added complexity in block building&lt;/h3&gt;

&lt;p&gt;Optimal block construction becomes more complex, since builders must now balance resource usage across multiple dimensions rather than a single gas metric. Sophisticated builders may gain an advantage by applying advanced optimization techniques, raising concerns about further builder centralization. However, practical heuristics (e.g., greedily filling blocks until one resource dimension saturates) remain effective for most use cases. These heuristics limit centralization pressure by keeping block construction feasible for local and less sophisticated builders.&lt;/p&gt;

&lt;h3 id=&quot;gas_left-can-increase&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; can increase&lt;/h3&gt;

&lt;p&gt;Refills credit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; before &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt;, so a frame’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; can be higher after an operation than before it. A contract measuring work as the difference between two &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS&lt;/code&gt; reads then gets a negative value. This reverts under checked arithmetic and wraps under unchecked arithmetic.&lt;/p&gt;

&lt;p&gt;A negative result requires the charge to have drawn from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;, i.e. the reservoir to be empty. That is the case for every transaction with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx.gas&lt;/code&gt; up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TX_MAX_GAS_LIMIT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is already possible in a single frame. Allocating a storage slot that was zero at transaction start and clearing it again refills &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATE_BYTES_PER_STORAGE_SET × CPSB&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE(k, 1); GAS; SSTORE(k, 0); GAS&lt;/code&gt; shows it: the two reads differ by the refill less the cost of the clear. Reads around both stores do not, because the charge and the refill cancel between them.&lt;/p&gt;

&lt;p&gt;Returning state-gas on a merge extends this across a call boundary, which no call does today. Metering a sub-call this way is the more common pattern. The amount is not limited to one slot: a merge returns up to the whole &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_from_gas_left&lt;/code&gt; the frame has accumulated. The bound is that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left + state_gas_from_gas_left&lt;/code&gt; never exceeds the frame’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; at entry.&lt;/p&gt;

&lt;h3 id=&quot;interaction-with-erc-4337-bundles&quot;&gt;Interaction with &lt;a href=&quot;/EIPS/eip-4337&quot;&gt;ERC-4337&lt;/a&gt; bundles&lt;/h3&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS&lt;/code&gt; opcode returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_left&lt;/code&gt; only and cannot observe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;state_gas_reservoir&lt;/code&gt;. Bundling protocols that meter sub-call consumption via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gasleft()&lt;/code&gt; deltas (e.g., the &lt;a href=&quot;/EIPS/eip-4337&quot;&gt;ERC-4337&lt;/a&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EntryPoint&lt;/code&gt;) therefore cannot accurately attribute state-gas usage when it is funded by the reservoir. Because all user operations in a bundle share the transaction’s reservoir, one user operation’s state-gas refunds can subsidize another’s state-gas charges without appearing in either’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gasleft()&lt;/code&gt; delta. Bundlers and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EntryPoint&lt;/code&gt; implementations MUST account for state-gas charges and refunds explicitly rather than relying on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gasleft()&lt;/code&gt; differences alone.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Wed, 01 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8037</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8037</guid>
      </item>
      
      
    
      
      
      
      <item>
        <title>State-access gas cost update</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8038 - State-access gas cost update&lt;/strong&gt; is in Last Call status. It is authored by Maria Silva (@misilva73), Wei Han Ng (@weiihann), Ansgar Dietrichs (@adietrichs) and was originally created 2025-10-03. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8038-state-access-gas-cost-update/25693&quot;&gt;https://ethereum-magicians.org/t/eip-8038-state-access-gas-cost-update/25693&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP updates the gas cost of state-access operations to reflect Ethereum’s larger state and the consequent slowdown of these operations. It dissects the cost of state-touching operations into three components — access, write, and state creation: the cold account access cost (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;) is raised, explicit write surcharges (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt;) are introduced, state-creation costs are left to &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt; are charged for their second database read.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;The gas price of accessing state has not been updated for quite some time. &lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt; was included in the Berlin fork in March 2021 and raised the costs of state-accessing opcodes. Yet, since then, Ethereum’s state has grown significantly, thus deteriorating the performance of these operations. This proposal further raises state access costs to better align them with the current performance of state access operations, in relation to other operations.&lt;/p&gt;

&lt;p&gt;Additionally, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt; have the same access cost as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BALANCE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODEHASH&lt;/code&gt;. However, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt; require two database reads - first to load the account object (which includes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nonce&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;balance&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;codeHash&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storageRoot&lt;/code&gt;), and second to collect the required information (the code size and bytecode respectively). Therefore, the access cost of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt; should be higher when compared with the other account read operations.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;cost-components&quot;&gt;Cost components&lt;/h3&gt;

&lt;p&gt;The gas cost of a state-touching operation is the sum of up to three independent components:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Access&lt;/strong&gt; — the cost of loading an account or storage slot from the database: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_STORAGE_ACCESS&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;, renamed by this EIP from the &lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt; parameters. This EIP raises &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;, while &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_STORAGE_ACCESS&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; are unchanged; the &lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt; rules that determine whether an access is cold or warm are unchanged.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Write&lt;/strong&gt; — the cost of writing an object’s leaf values when they change, whether or not the leaf already exists: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; for a storage slot and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; for an account’s leaf values (nonce, balance, code hash), both introduced by this EIP. The pre-existing schedule has no standalone constant for this component; it is fused into composites such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_STORAGE_UPDATE&lt;/code&gt; (&lt;a href=&quot;/EIPS/eip-2200&quot;&gt;EIP-2200&lt;/a&gt;’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE_RESET_GAS&lt;/code&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL_VALUE&lt;/code&gt; (the Yellow Paper’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G_callvalue&lt;/code&gt;) and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G_create&lt;/code&gt;). The two write surcharges follow different charging disciplines, stated once here and applying everywhere below:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; is net-metered within a transaction: it is charged by each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; that moves a slot away from its transaction-start value and credited back by each later &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; that restores that value (refund rule 3 below), so a slot that ends the transaction with a changed value pays it exactly once and a slot that ends unchanged pays only access costs, subject to the refund cap.&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; is charged per operation that writes an account’s leaf values. For every operation specified in this EIP there is no per-account tracking and no refund: a value-bearing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; to the same recipient pays it on each call. (&lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt; charges it at most once per authority per transaction when processing &lt;a href=&quot;/EIPS/eip-7702&quot;&gt;EIP-7702&lt;/a&gt; authorizations; that first-write rule is defined there and applies only to authorization processing.)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;State creation&lt;/strong&gt; — the cost of adding a new leaf to the state: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_STORAGE_SET&lt;/code&gt; for a new storage slot and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; for a new account. This EIP does not reprice these constants; they are repriced by &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt; and charged to its state-gas dimension. This EIP states where the component applies so that each operation’s complete cost is visible in one place.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The sections below specify each operation as a consumer of this model: which access cost applies, whether and when a write surcharge applies, and which state-creation charge accompanies it.&lt;/p&gt;

&lt;h3 id=&quot;parameters&quot;&gt;Parameters&lt;/h3&gt;

&lt;p&gt;Upon activation of this EIP, the following parameters of the gas model are introduced/updated:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Parameter&lt;/strong&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Current value&lt;/strong&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;New value&lt;/strong&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Increase&lt;/strong&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;&lt;strong&gt;Operations affected&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Access&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cold touch of an account. Renamed from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS_COST&lt;/code&gt; (&lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt;)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2,600&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3,000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;+15%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*CALL&lt;/code&gt; opcodes, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BALANCE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXT*&lt;/code&gt; opcodes, EOA delegation resolution, EOA delegation setting (5), contract creation txs / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; (4), and ETH transfers&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_STORAGE_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Access&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cold touch of a storage slot. Renamed from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_SLOAD_COST&lt;/code&gt; (&lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt;)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2,100&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2,100&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;+0%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOAD&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Access&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Touch of an already-warm account or storage slot. Renamed from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_STORAGE_READ_COST&lt;/code&gt; (&lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt;)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;100&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;100&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;+0%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOAD&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*CALL&lt;/code&gt; opcodes, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BALANCE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXT*&lt;/code&gt; opcodes, EOA delegation resolution, EOA delegation setting (5)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Write&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Write to an account’s leaf values (nonce, balance, code hash); charged per operation. New named parameter (previously embedded in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL_VALUE&lt;/code&gt;, see footnote 1)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;6,700 (1)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;9,000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;+34%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;value-transferring &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*CALL&lt;/code&gt; opcodes, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;, contract creation txs / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; (4), EOA delegation setting&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Write&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Write that changes a storage slot’s value; net-metered per transaction. New named parameter (previously derived, see footnote 2)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2,800 (2)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;10,000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;+257%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Access + write&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Combined access-and-write cost of contract deployment: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;. New named parameter (previously derived, see footnote 3)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;7,000 (3)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;12,000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;+71%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;contract creation txs / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_CLEAR_REFUND&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Refund&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Refund for clearing a storage slot. Renamed from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE_CLEARS_SCHEDULE&lt;/code&gt; (&lt;a href=&quot;/EIPS/eip-3529&quot;&gt;EIP-3529&lt;/a&gt;)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4,800&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;11,616&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;+142%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCESS_LIST_STORAGE_KEY_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Access (prepaid)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Gas charged per storage key included in a transaction’s access list. Unchanged name from &lt;a href=&quot;/EIPS/eip-2930&quot;&gt;EIP-2930&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1,900&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2,000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;+5%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLOAD&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCESS_LIST_ADDRESS_COST&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Access (prepaid)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Gas charged per address included in a transaction’s access list. Unchanged name from &lt;a href=&quot;/EIPS/eip-2930&quot;&gt;EIP-2930&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2,400&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2,900&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;+21%&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*CALL&lt;/code&gt; opcodes, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BALANCE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXT*&lt;/code&gt; opcodes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;(1): 6,700 = &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL_VALUE&lt;/code&gt; (the Yellow Paper’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G_callvalue&lt;/code&gt;, 9,000) - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL_STIPEND&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G_callstipend&lt;/code&gt;, 2,300)&lt;/p&gt;

&lt;p&gt;(2): 2,800 = &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_STORAGE_UPDATE&lt;/code&gt; (&lt;a href=&quot;/EIPS/eip-2200&quot;&gt;EIP-2200&lt;/a&gt;’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE_RESET_GAS&lt;/code&gt;, 5,000) - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_COLD_SLOAD&lt;/code&gt; (2,100) - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_WARM_ACCESS&lt;/code&gt; (100)&lt;/p&gt;

&lt;p&gt;(3): 7,000 = &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt; (the Yellow Paper’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G_create&lt;/code&gt;, 32,000) - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G_newaccount&lt;/code&gt;, 25,000)&lt;/p&gt;

&lt;p&gt;(4): Charged only as part of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt;, not separately — these operations pay &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt; once, and never &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; on top of it. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; charge is specified in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; section below; the contract-creation transaction charge is specified in &lt;a href=&quot;/EIPS/eip-2780&quot;&gt;EIP-2780&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(5): Charged only as part of &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXECUTION_PER_AUTH_BASE_COST&lt;/code&gt;. Setting a delegation is distinct from resolving one: resolution loads the delegation target’s code at runtime and is charged the standard cold or warm access directly.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt; are new parameters with no pre-existing counterpart; their “Current value” column shows the equivalent cost extracted from the pre-existing composite constants per the footnotes above. The pre-existing schedule is not exactly separable into these components, so these equivalents are approximate: footnote 2 yields the write component of the current warm-case &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; charge exactly (2,900 = &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_WARM_ACCESS&lt;/code&gt; + 2,800), while the cold-case charge of 5,000 exceeds the sum of its components by 100; footnote 3 is discussed in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; section below.&lt;/p&gt;

&lt;h3 id=&quot;sstore-pricing&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; pricing&lt;/h3&gt;

&lt;p&gt;In addition, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; cost formula is updated. As in &lt;a href=&quot;/EIPS/eip-2200&quot;&gt;EIP-2200&lt;/a&gt;, the &lt;em&gt;original value&lt;/em&gt; is the slot’s value at the start of the current transaction and the &lt;em&gt;current value&lt;/em&gt; is its value just before the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; executes. The complete &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; charge is the sum of its three cost components:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Access component: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_STORAGE_ACCESS&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;, depending on whether the storage slot is cold or warm.&lt;/li&gt;
  &lt;li&gt;Write component: additionally charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; if the new value is different from the current value and the current value equals the original value (the write moves the slot away from its transaction-start value).&lt;/li&gt;
  &lt;li&gt;State-creation component: additionally charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_STORAGE_SET&lt;/code&gt; (per &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;, metered in state-gas) if the original value is zero, the current value is zero, and the new value is non-zero.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Refunds are also updated as follows. Each rule is an adjustment to the transaction’s refund counter and is evaluated on every &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_CLEAR_REFUND&lt;/code&gt; is added if the original value is non-zero, the current value is non-zero and the new value is zero (a slot is cleared).&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_CLEAR_REFUND&lt;/code&gt; is subtracted if the original value is non-zero, the current value is zero and the new value is non-zero (a slot that was cleared earlier in the same transaction is set to a non-zero value again, whether or not that value is its original one). This reverses the refund granted by rule 1, so that clearing and then re-setting a slot within the same transaction is never net-profitable.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; is refunded if the new value equals the original value and differs from the current value (a change made earlier in the same transaction is undone, restoring the slot’s transaction-start value).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rules 2 and 3 mirror the refund accounting of &lt;a href=&quot;/EIPS/eip-2200&quot;&gt;EIP-2200&lt;/a&gt; and &lt;a href=&quot;/EIPS/eip-3529&quot;&gt;EIP-3529&lt;/a&gt; for slots that are modified more than once within a transaction: a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; charge or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_CLEAR_REFUND&lt;/code&gt; granted on an earlier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; to the same slot is undone when a later &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; returns the slot to its original value. Without these reversals, a round trip such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x → 0 → x&lt;/code&gt; would yield a net refund even though the slot ends the transaction unchanged. Net over the whole transaction, a slot that ends at a changed value pays its write and state-creation components exactly once, and a slot that ends at its original value pays only its access costs — in both cases regardless of how often the slot was written, and subject to the refund cap.&lt;/p&gt;

&lt;p&gt;These refunds go to the transaction’s refund counter and are capped to 20% of the total gas used by the transaction, as per the current refund mechanism.&lt;/p&gt;

&lt;p&gt;The rules for state creation cost charges and refills are addressed in &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cases and their corresponding costs are detailed in the table below:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Original value&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Current value&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;New value&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Access status&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Description&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Execution-gas charges/refunds&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;State-gas charges/refills&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cold&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;New slot&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_STORAGE_ACCESS&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; charged&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_STORAGE_SET&lt;/code&gt; charged&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;New slot&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; charged&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_STORAGE_SET&lt;/code&gt; charged&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;y&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cold&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Existing slot, first change&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_STORAGE_ACCESS&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; charged&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;y&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Existing slot, first change&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; charged&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cold&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cleared slot, non-zero at transaction start&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_STORAGE_ACCESS&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; charged, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_CLEAR_REFUND&lt;/code&gt; refunded&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cleared slot, non-zero at transaction start&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; charged, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_CLEAR_REFUND&lt;/code&gt; refunded&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Set slot reset to zero (zero at transaction start)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; charged, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; refunded&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_STORAGE_SET&lt;/code&gt; refilled&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;y&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Slot set earlier in the transaction written to a different non-zero value&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; charged&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;y&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Previously-modified slot reset to original value&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; charged, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; refunded&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;y&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Previously-modified slot cleared, non-zero at transaction start&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; charged, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_CLEAR_REFUND&lt;/code&gt; refunded&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cleared slot restored to original value&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; charged, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt; refunded, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_CLEAR_REFUND&lt;/code&gt; reversed&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;y&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cleared slot written to a new non-zero value&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; charged, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_CLEAR_REFUND&lt;/code&gt; reversed&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;x&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;y&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;z&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Warm&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Previously-modified slot written to another non-zero value&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; charged&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;no state-gas adjustments&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;account-access-pricing&quot;&gt;Account access pricing&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt; rules that determine whether an account access is cold or warm are unchanged; this EIP raises the cold access cost and states explicitly, per operation below, where the write and state-creation components apply.&lt;/p&gt;

&lt;h4 id=&quot;callcallcode&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALLCODE&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALLCODE&lt;/code&gt; operations, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL_VALUE&lt;/code&gt; (the Yellow Paper’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G_callvalue&lt;/code&gt;) is redefined as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE + CALL_STIPEND&lt;/code&gt;, where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL_STIPEND&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G_callstipend&lt;/code&gt;, 2,300) is unchanged. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; here prices the write to the recipient’s balance leaf and, per its charging discipline, is paid on every value-transferring call. The state-creation component of a value-transferring &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; to a dead account (as defined in &lt;a href=&quot;/EIPS/eip-161&quot;&gt;EIP-161&lt;/a&gt;) is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt;, which this EIP does not reprice; it is repriced and metered in state gas by &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALLCODE&lt;/code&gt; never incurs it: its recipient is the calling account itself, which already exists.&lt;/p&gt;

&lt;h4 id=&quot;createcreate2&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; operations don’t have explicit warm/cold pricing. Instead, the flat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt; (the Yellow Paper’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;G_create&lt;/code&gt;, 32,000) is replaced by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt;, charged in execution gas, plus &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt;, charged in state gas (per &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;). &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt;, defined as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;, is the combined access-and-write component of the deployment; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; is its state-creation component and is not repriced by this EIP.&lt;/p&gt;

&lt;p&gt;Note: this definition does not exactly match the legacy decomposition shown in footnote 3 of the Parameters table (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt; - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; = 7,000). The pre-existing accounting in the protocol is not internally consistent here, and this EIP keeps the discrepancy rather than attempting to reconcile it.&lt;/p&gt;

&lt;h4 id=&quot;selfdestruct&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;, charge &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; in execution gas if the beneficiary is cold, regardless of the balance being transferred. A warm beneficiary incurs no access charge: the &lt;a href=&quot;/EIPS/eip-2929&quot;&gt;EIP-2929&lt;/a&gt; exemption from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; is preserved, including when the beneficiary is the executing account itself or a precompile. The opcode base cost and the rules for determining and updating the beneficiary’s cold or warm status are unchanged.&lt;/p&gt;

&lt;p&gt;For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;, an additional charge of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; is added if a positive balance is sent to a dead account (as defined in &lt;a href=&quot;/EIPS/eip-161&quot;&gt;EIP-161&lt;/a&gt;) — the write component of creating the beneficiary’s leaf. The state-creation component in this same case is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt;, which remains in place alongside the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; charge and is metered in state-gas by &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;ext-family-update&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXT*&lt;/code&gt; family update&lt;/h4&gt;

&lt;p&gt;Besides the current access costs, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt; are charged an additional &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;overview&quot;&gt;Overview&lt;/h4&gt;

&lt;p&gt;The cases for account-related operations and their corresponding cost components are summarized in the table below. The state-creation column is charged in state-gas and is not repriced by this EIP (see &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt;).&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Operation&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Access component&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Write component (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt;)&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;State-creation component&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALLCODE&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;when value is transferred (via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL_VALUE&lt;/code&gt; = &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL_STIPEND&lt;/code&gt;)&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; transfers value to a dead account; never for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALLCODE&lt;/code&gt;, whose recipient is the calling account&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DELEGATECALL&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STATICCALL&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;never (no value transfer)&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;—&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;folded into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;always (folded into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE_ACCESS&lt;/code&gt; = &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;, replacing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_CREATE&lt;/code&gt;)&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt;, plus the per-byte code-deposit cost&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; if cold; zero if warm&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;when a positive balance is sent to a dead account&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_NEW_ACCOUNT&lt;/code&gt; in the same case&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BALANCE&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODEHASH&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;never&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;—&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;, plus &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; for the second database read&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;never&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;—&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;empirical-estimation-of-gas-costs&quot;&gt;Empirical Estimation of Gas Costs&lt;/h3&gt;

&lt;h4 id=&quot;selecting-which-operations-to-reprice&quot;&gt;Selecting which Operations to Reprice&lt;/h4&gt;

&lt;p&gt;The parameters selected for repricing in this EIP were chosen based on the estimated million gas per second (Mgas/s) performance of their respective operations. For this EIP, a performance target of &lt;strong&gt;100 million gas per second&lt;/strong&gt; is chosen. With this performance target, we will be able to increase the base throughput of the chain by a factor of 5 from our current 20 Mgas/s performance.&lt;/p&gt;

&lt;h4 id=&quot;data-collection&quot;&gt;Data Collection&lt;/h4&gt;

&lt;p&gt;The gas costs proposed in this EIP are based on the actual time each execution client takes to run a specific set of benchmarks. Similar to the methodology used in the Gas Cost Estimator project, we generate synthetic blocks that isolate and stress individual EVM operations and use them to derive the various gas parameters.&lt;/p&gt;

&lt;p&gt;Concretely, to benchmark a single operation/parameter, different blocks are created by varying the number of times the target operation is executed and by changing the parameter values to the operation. The EEST benchmark suite contains the tests used to generate these blocks.&lt;/p&gt;

&lt;p&gt;Then, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Benchmarkoor&lt;/code&gt; tool is used to collect the needed metrics. This tool returns the total execution time of the block and the number of times each operation was executed. Each test block is run multiple times on each client to account for variability in execution time.&lt;/p&gt;

&lt;p&gt;All benchmarks were run on top of a snapshot with the same size as mainnet in March 2026, so they reflect the current performance of state access operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about differences between client implementations?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ultimately, we require a single cost model that is independent of the client’s implementation. Although the decision may be different in a specific situation, the general rule is to take the worst client result that cannot be optimized. This means that the worst-performing client on a given operation and resource combination will define the cost of that operation for the entire network. This is the safer and most conservative choice.&lt;/p&gt;

&lt;h4 id=&quot;runtime-estimation&quot;&gt;Runtime Estimation&lt;/h4&gt;

&lt;p&gt;To estimate the runtime of a single operation from the total execution time of the corresponding synthetic blocks, a &lt;strong&gt;Non-Negative Least Squares Linear Regression&lt;/strong&gt; is used. This model enforces that all coefficients are non-negative, thus ensuring execution time cannot be negative. The model estimates runtime as a linear combination of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Constant term (intercept)&lt;/strong&gt;: Base overhead for executing the test, which includes setup and tear-down time&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Operation count (slope)&lt;/strong&gt;: Number of times the operation is executed in the test. This parameter is the one that allows us to estimate the per-operation runtime.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Operation-specific parameters (e.g., update)&lt;/strong&gt;: Extra per-operation runtime contributed by an additional, operation-specific binary or numeric input (e.g., whether a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; is made with value, or whether the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSTORE&lt;/code&gt; writes a new value). The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update&lt;/code&gt; coefficient gives the marginal runtime added per execution for storage writes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For simple operations (i.e., without additional parameters), the model estimates: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime = intercept + slope × operation_count&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For variable operations, the model estimates: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime = intercept + slope × operation_count + param1_coef × operation_count × param1 + param2_coef × operation_count × param2 + ...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Independent models are created for each client, operations, and configuration. Only operations and parameters with good model fits (R-squared &amp;gt; 0.5 and p-value &amp;lt; 0.05) are included in the gas cost proposal to ensure the reliability of the estimates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Glue opcode adjustment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each benchmark test includes auxiliary “glue” opcodes that scale linearly with the main opcode count. The regression slope captures the combined runtime of both the target opcode and its glue opcodes, so we subtract the estimated glue opcode runtime to isolate the true per-execution cost:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;adjusted_slope = slope - sum(ratio_i * glue_runtime_i)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Where, for each glue opcode &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ratio_i&lt;/code&gt; is the number of executions of glue opcode &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt; per execution of the target opcode in the benchmark test.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;glue_runtime_i&lt;/code&gt; is the estimated per-execution runtime of glue opcode &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt;, taken from its own regression model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only glue opcodes with a statistically significant fit (p-value &amp;lt; 0.05) are included. The adjusted slope is clipped to a minimum of zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parameter mapping&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each gas parameter is derived from one or more benchmark models by selecting a specific regression coefficient (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slope&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update&lt;/code&gt;) after applying the relevant filters (test name, cache strategy, account mode). The two coefficients correspond directly to the two cost components this EIP prices: the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slope&lt;/code&gt; measures the cost of loading the object from the database (the access component), while the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update&lt;/code&gt; coefficient measures the marginal cost of changing its value (the write component). The state-creation component is not estimated from runtime at all — it prices durable state growth rather than execution time — which is why it is derived separately in &lt;a href=&quot;/EIPS/eip-8037&quot;&gt;EIP-8037&lt;/a&gt; and left unchanged here.&lt;/p&gt;

&lt;p&gt;For each parameter and client, the worst-case value across all matching model configurations is used. The final proposal takes the worst case across clients.&lt;/p&gt;

&lt;p&gt;The following table lists the directly estimated parameters and their mapping to the regression models:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Test name&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Configuration&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Model&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Parameter mapping&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_account_access&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CacheStrategy = NO_CACHE&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;runtime = intercept + slope × operation_count + update × value_sent x operation_count&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slope&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCOUNT_ACCESS&lt;/code&gt;; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ACCOUNT_WRITE&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_sload_bloated&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CacheStrategy = NO_CACHE&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;runtime = intercept + slope × operation_count&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slope&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_STORAGE_ACCESS&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_sstore_bloated&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CacheStrategy = NO_CACHE&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;runtime = intercept + slope × operation_count + update × write_new_value x operation_count&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slope&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_STORAGE_ACCESS&lt;/code&gt;; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;update&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STORAGE_WRITE&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_sload_same_key_benchmark&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;—&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;runtime = intercept + slope × operation_count&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slope&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_ext_account_query_warm&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;—&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;runtime = intercept + slope × operation_count&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slope&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_sstore_bloated&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_sload_bloated&lt;/code&gt; targeted a bespoke contract with a storage size of 10 gigabytes, which is the size of the largest mainnet contract.&lt;/p&gt;

&lt;h4 id=&quot;conversion-to-gas-costs&quot;&gt;Conversion to gas costs&lt;/h4&gt;

&lt;p&gt;New gas costs are calculated using the same target performance of 100 Mgas/s. The formula used is:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;new_gas = (anchor_rate * runtime_ms) / 1000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;anchor_rate&lt;/code&gt; is the target performance expressed in gas per second (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;100_000_000&lt;/code&gt; for a 100 Mgas/s target).&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime_ms&lt;/code&gt; is the estimated runtime per operation, in milliseconds, taken from the regression models (the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;adjusted_slope&lt;/code&gt; defined above).&lt;/li&gt;
  &lt;li&gt;The factor &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1000&lt;/code&gt; converts &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime_ms&lt;/code&gt; from milliseconds to seconds, so that the product with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;anchor_rate&lt;/code&gt; (gas/second) yields a result in gas units.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Derived parameters&lt;/strong&gt; are computed from the directly estimated ones:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;STORAGE_CLEAR_REFUND         = (STORAGE_WRITE + COLD_STORAGE_ACCESS) * (4800/5000)
ACCESS_LIST_STORAGE_KEY_COST = COLD_STORAGE_ACCESS - WARM_ACCESS
ACCESS_LIST_ADDRESS_COST     = COLD_ACCOUNT_ACCESS - WARM_ACCESS
CREATE_ACCESS                = ACCOUNT_WRITE + COLD_ACCOUNT_ACCESS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The two access-list parameters price the same database load as their cold counterparts, so they are derived from those cold costs. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; is subtracted because a slot or account named in the access list is already warm when the transaction touches it and is therefore still charged &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; at that point: prepaying via the access list must not cost more in access gas than taking the cold access. Without the subtraction, an access-list entry that is used exactly once would cost &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COLD_ACCESS + WARM_ACCESS&lt;/code&gt; in access gas, making the list strictly more expensive than not using it. The invariant covers the access component only; charges that other EIPs levy on the access list’s bytes, such as floor costs, fall outside it.&lt;/p&gt;

&lt;h3 id=&quot;interaction-with-eip-7928&quot;&gt;Interaction with &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; introduces Block-Level Access Lists, which enable parallel disk reads, parallel transaction validation, and state updates without execution through client optimizations. Our benchmarks already consider these optimization gains by running on clients with the optimizations implemented.&lt;/p&gt;

&lt;h3 id=&quot;special-case-for-extcodesize-and-extcodecopy&quot;&gt;Special case for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Differently from other account read operations, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODESIZE&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXTCODECOPY&lt;/code&gt; make two reads to the database. The first read is the same, where the object of the target account is loaded. This object includes the account’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nonce&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;balance&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;codeHash&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storageRoot&lt;/code&gt;. Then, these operations do another read to collect either the code size or the bytecode of the account. This second read is to an already warmed account, and thus we propose to price it as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARM_ACCESS&lt;/code&gt; for consistency.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This is a backwards-incompatible gas repricing that requires a scheduled network upgrade.&lt;/p&gt;

&lt;p&gt;Wallet developers and node operators MUST update gas estimation handling to accommodate the new state access cost rules. Specifically:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Wallets: Wallets using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth_estimateGas&lt;/code&gt; MUST be updated to ensure that they correctly account for the updated gas parameters. Failure to do so could result in underestimating gas, leading to failed transactions.&lt;/li&gt;
  &lt;li&gt;Node Software: RPC methods such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth_estimateGas&lt;/code&gt; MUST incorporate the updated formula for gas calculation with the new state access cost values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users can maintain their usual workflows without modification, as wallet and RPC updates will handle these changes.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;Changing the cost of state access operations could impact the usability of certain applications. More analysis is needed to understand the potential effects on various dApps and user behaviors.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 03 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8038</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8038</guid>
      </item>
      
      
    
      
    
      
    
      
    
      
      
      
      <item>
        <title>Exclude slashed validators from proposing</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8045 - Exclude slashed validators from proposing&lt;/strong&gt; is in Last Call status. It is authored by Francesco D&apos;Amato (@fradamt), Barnabas Busa (@barnabasbusa) and was originally created 2025-10-16. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8045-exclude-slashed-validators-from-proposing/25850&quot;&gt;https://ethereum-magicians.org/t/eip-8045-exclude-slashed-validators-from-proposing/25850&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP proposes a modification to the beacon chain proposer selection process to exclude slashed validators from being selected as proposers.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;Currently, slashed validators can still be selected as proposers, though their blocks are considered invalid by the state transition function, resulting in missed slots. This is in particular problematic after a mass slashing event, at which point there can be a long period with degraded chain performance, until all slashed validators are exited. If mass slashing also comes with general network disruption, the missed slots can also significantly complicate the recovery process. This change filters out slashed validators during proposer selection, reducing disruption and increasing resilience in such scenarios.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc2119&quot;&gt;RFC 2119&lt;/a&gt; and &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8174&quot;&gt;RFC 8174&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_beacon_proposer_indices&lt;/code&gt; function in the consensus specifications is modified to exclude slashed validators from the proposer selection process, effectively going from considering all
active validators to all active and unslashed validators.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_beacon_proposer_indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BeaconState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epoch&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Vector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ValidatorIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SLOTS_PER_EPOCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
    Return the proposer indices for the given ``epoch``.
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Modified to exclude slashed validators
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;indices&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_active_validator_indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;validators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slashed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;seed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_seed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DOMAIN_BEACON_PROPOSER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compute_proposer_indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;seed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;indices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;why-exclude-slashed-validators&quot;&gt;Why exclude slashed validators?&lt;/h3&gt;

&lt;p&gt;Slashed validators are already prevented from successfully proposing blocks through the state transition validation. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_block&lt;/code&gt; function checks that the proposer is not slashed, and blocks from slashed proposers are considered invalid. Therefore, selecting slashed validators as proposers serves no purpose and only results in missed slots.&lt;/p&gt;

&lt;h3 id=&quot;design-decision-upfront-filtering&quot;&gt;Design decision: upfront filtering&lt;/h3&gt;

&lt;p&gt;The chosen approach is to simply filter out slashed validators from the candidate pool, before doing any shuffling computation. An alternative design would be to still use the whole active validator set as the candidate pool, and then only filter out slashed validators once their index has been selected by the shuffle. The exact selection is not identical, but it achieves the same goal, i.e., a balance-weighted selection from the set of active-and-unslashed validators. The complexity is low in either design.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP introduces a backwards-incompatible change to the consensus rules and MUST be activated as part of a scheduled network upgrade.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;p&gt;Test cases should verify that:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Slashed validators are not selected as proposers&lt;/li&gt;
  &lt;li&gt;A complete &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proposer_lookahead&lt;/code&gt; is generated even in the presence of slashed validators&lt;/li&gt;
  &lt;li&gt;Slashings do not affect the existing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proposer_lookahead&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;Slashed validators are already prevented from successfully proposing blocks through the state transition validation, for good reason, as they are considered to be unreliable participants (malicious or faulty). However, they have historically still been eligible to be selected as proposers in order to ensure stability of the proposer selection mechanism, because excluding them would have severely impacted the stability of the proposer selection mechanism. In fact, any slashing processed on chain would have caused the sequence of future proposers to completely change, even within the lookahead window. However, with &lt;a href=&quot;/EIPS/eip-7917&quot;&gt;EIP-7917&lt;/a&gt;, the proposer selection is fixed in advance by storing in the Beacon state, so it would not be affected by slashings processed after the fact.&lt;/p&gt;

&lt;h3 id=&quot;impact-on-proposer-selection-distribution&quot;&gt;Impact on proposer selection distribution&lt;/h3&gt;

&lt;p&gt;This change does not affect the randomness or fairness of proposer selection among non-slashed validators. The selection algorithm remains the same, with the only difference being that slashed validators are excluded from the candidate pool.&lt;/p&gt;

&lt;h3 id=&quot;mass-slashing-scenarios&quot;&gt;Mass slashing scenarios&lt;/h3&gt;

&lt;p&gt;During mass slashing events, this change is purely beneficial to the resilience of the network, as well as to general quality of service. Instead of having many slashed validators selected as proposers (resulting in many missed slots), the network will continue to operate normally with only non-slashed validators being selected.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Thu, 16 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8045</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8045</guid>
      </item>
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>Increase exit and consolidation churn</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8061 - Increase exit and consolidation churn&lt;/strong&gt; is in Last Call status. It is authored by Francesco D&apos;Amato (@fradamt), Anders Elowsson (@anderselowsson) and was originally created 2025-10-17. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8061-increase-churn-limits/25991&quot;&gt;https://ethereum-magicians.org/t/eip-8061-increase-churn-limits/25991&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP roughly doubles the consolidation churn, as well as quadrupling the exit churn and restoring its proportionality to total stake (though maintaining the existing cap on activations). The choice of parameters balances maintaining a sufficiently long weak subjectivity period (~7 days, roughly halving the current period) with achieving two goals: allowing for faster consolidation of the validator set, in turn accelerating the timeline to faster finality, and relieving exit queue congestion, improving staking liquidity.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7514&quot;&gt;EIP-7514&lt;/a&gt; introduced an activation cap of 8 validators per epoch (now 256 ETH per epoch) to prevent overly rapid validator set growth. &lt;a href=&quot;/EIPS/eip-7251&quot;&gt;EIP-7251&lt;/a&gt; extended this cap to exits, to make room for the newly introduced consolidation operations, without increasing the weak subjectivity period. However, the fixed cap prevents the exit churn limit from being proportional to total stake, which, all else being equal, leads to longer queues as stake grows. Moreover, the 
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CHURN_LIMIT_QUOTIENT&lt;/code&gt; is set quite conservatively in the first place, requiring more than 3 months for 1/3 of the validator set to exit, a time which is now be more than doubled due to the cap. Recent episodes have stressed for more headroom to improve liquidity and staking user experience, as the exit queue has stretched beyond forty days as a consequence of the mass exit of Kiln validators. Long queues degrade user experience, and slow operator response to market or operational events. They also reduce the network’s ability to reconfigure stake more quickly after adverse events, for example to regain finality by having a large amount of stake exit (a double-edged sword, as preventing double finality is the reason these queues exist in the first place, as discussed in the security section). Finally, centralized forms of staking are those that (in relative terms) benefit the most from a lack of liquidity today, as they have the ability to issue a liquid staking token, maintain liquidity reserves or more generally build products that get around the limitations of the protocol.&lt;/p&gt;

&lt;p&gt;The conservative setting of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CHURN_LIMIT_QUOTIENT&lt;/code&gt; affects consolidations as well. Increasing the consolidation churn limit can shorten the path to a smaller validator set and, in turn, the path to a protocol with much faster finality. Under today’s parameters, even the best-case timelines are long: using only activations and exits, fully saturated around the clock, shrinking the roughly 32M ETH of 0x01 stake would take on the order of ~1.5 years; a fully saturated consolidation queue would still take ~1.3 years. Moreover, deposit capacity is also needed for new stake and is thus far from guaranteed to be available for consolidations, as evidenced by the recent inflow of &amp;gt; 1M ETH, fully occupying the queue for ~20 days.&lt;/p&gt;

&lt;p&gt;The EIP proposes to address these issues by:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;removing the cap on exits, restoring the proportionality of exit churn limit to total stake&lt;/li&gt;
  &lt;li&gt;increasing the churn limit on exits&lt;/li&gt;
  &lt;li&gt;introducing a separate consolidation churn limit, since there is no more “excess churn” from having an exit cap, and increase it compared to the current (implicitly defined) one. This also lets us more independently adjust it in the future, for example to increase it if we want to allow for faster consolidation of the validator set or decrease it when this process has already run its course.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The EIP does &lt;em&gt;not&lt;/em&gt; propose to lift the cap on the deposit churn, as part of the motivation for introducing it in &lt;a href=&quot;/EIPS/eip-7514&quot;&gt;EIP-7514&lt;/a&gt; still holds today: though &lt;em&gt;active validator set&lt;/em&gt; growth is mostly solved by &lt;a href=&quot;/EIPS/eip-7251&quot;&gt;EIP-7251&lt;/a&gt;, the &lt;em&gt;validator array in the BeaconState&lt;/em&gt; (including inactive validators) is very large and still growing, and too rapid &lt;em&gt;stake&lt;/em&gt; growth continues to be a concern as well.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CHURN_LIMIT_QUOTIENT&lt;/code&gt; is halved, from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2**16&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2**15&lt;/code&gt;, and fully dedicated to activations and exits. However, the cap on activations introduced in &lt;a href=&quot;/EIPS/eip-7514&quot;&gt;EIP-7514&lt;/a&gt; is maintained via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT&lt;/code&gt;, while exits are freed from this cap. Consolidations now have their own dedicated churn, determined by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONSOLIDATION_CHURN_LIMIT_QUOTIENT&lt;/code&gt;. This is set here to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2**16&lt;/code&gt;, so that consolidations are allocated half as much churn as activations and exits combined, and a third of the total churn. Finally, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute_weak_subjectivity_period&lt;/code&gt; is adjusted to account for the asymmetry between exit and activation churn: a unit of exit churn has twice the weak subjectivity effect ($\frac{4}{3}$) of a unit of activation churn $\frac{2}{3}$, and a unit of consolidation churn has an effect equivalent to the sum of the other two ($2$).&lt;/p&gt;

&lt;h3 id=&quot;configuration&quot;&gt;Configuration&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT&lt;/code&gt; replaces the existing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT&lt;/code&gt;, also &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;256&lt;/code&gt;, as the cap now only applies to activations. We introduce the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONSOLIDATION_CHURN_LIMIT_QUOTIENT&lt;/code&gt; and update the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CHURN_LIMIT_QUOTIENT&lt;/code&gt;.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CHURN_LIMIT_QUOTIENT_GLOAS&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(2**15)&lt;/code&gt; (= 32,768)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONSOLIDATION_CHURN_LIMIT_QUOTIENT&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(2**16)&lt;/code&gt; (= 65,536)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64(2**8)&lt;/code&gt;  (=256)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;churn-computations&quot;&gt;Churn computations&lt;/h3&gt;

&lt;p&gt;Due to the intended asymmetry in activation and exit churn, we replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_activation_exit_churn_limit&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_activation_churn_limit&lt;/code&gt;, capped at  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_exit_churn_limit&lt;/code&gt;, uncapped. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_consolidation_churn_limit&lt;/code&gt; uses the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONSOLIDATION_CHURN_LIMIT_QUOTIENT&lt;/code&gt;, without either a minimum or a maximum value.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_activation_churn_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BeaconState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
    Per-epoch churn limit for activations, rounded to EFFECTIVE_BALANCE_INCREMENT.
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;get_total_active_balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHURN_LIMIT_QUOTIENT_GLOAS&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EFFECTIVE_BALANCE_INCREMENT&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_exit_churn_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BeaconState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
    Per-epoch churn limit for activations, rounded to EFFECTIVE_BALANCE_INCREMENT.
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;get_total_active_balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CHURN_LIMIT_QUOTIENT_GLOAS&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EFFECTIVE_BALANCE_INCREMENT&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_consolidation_churn_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BeaconState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
    Per-epoch churn limit for consolidations (EIP-7521), rounded to EFFECTIVE_BALANCE_INCREMENT.
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_total_active_balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CONSOLIDATION_CHURN_LIMIT_QUOTIENT&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EFFECTIVE_BALANCE_INCREMENT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute_weak_subjectivity_period&lt;/code&gt; we only replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delta = get_balance_churn_limit(state)&lt;/code&gt; with an explicit calculation taking into account the different weak subjectivity effect of each type of operation.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;compute_weak_subjectivity_period&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BeaconState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
    Returns the weak subjectivity period for the current ``state``.
    This computation takes into account the effect of validator set churn, 
    bounded by the three churn_limit functions used below.
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_total_active_balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;delta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_exit_churn_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# effect of exit churn
&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_activation_churn_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# effect of activation churn
&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_consolidation_churn_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# effect of consolidation churn
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;epochs_for_validator_set_churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SAFETY_DECAY&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;delta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MIN_VALIDATOR_WITHDRAWABILITY_DELAY&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epochs_for_validator_set_churn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;deposit-processing&quot;&gt;Deposit processing&lt;/h3&gt;

&lt;p&gt;The only modification is replacing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_activation_exit_churn_limit&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_activation_churn_limit&lt;/code&gt;, maintaing the current cap on deposit churn respects, while removing the cap from exits. This reverts to the pre-Electra status quo, when activations were capped but exits were not.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;process_pending_deposits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BeaconState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;next_epoch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_current_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [Modified in Gloas:EIP-8061]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;available_for_processing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deposit_balance_to_consume&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_activation_churn_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;processed_amount&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;next_deposit_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deposits_to_postpone&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;is_churn_limit_reached&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;finalized_slot&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compute_start_slot_at_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;finalized_checkpoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pending_deposits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Do not process deposit requests if Eth1 bridge deposits are not yet applied.
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# Is deposit request
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GENESIS_SLOT&lt;/span&gt;
            &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# There are pending Eth1 bridge deposits
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;eth1_deposit_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deposit_requests_start_index&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Check if deposit has been finalized, otherwise, stop processing.
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slot&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;finalized_slot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Check if number of processed deposits has not reached the limit, otherwise, stop processing.
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next_deposit_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAX_PENDING_DEPOSITS_PER_EPOCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Read validator state
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;is_validator_exited&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;is_validator_withdrawn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;validator_pubkeys&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pubkey&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;validators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pubkey&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;validator_pubkeys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;validator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;validators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ValidatorIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;validator_pubkeys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pubkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))]&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;is_validator_exited&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;validator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exit_epoch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FAR_FUTURE_EPOCH&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;is_validator_withdrawn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;validator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;withdrawable_epoch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;next_epoch&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;is_validator_withdrawn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# Deposited balance will never become active. Increase balance but do not consume churn
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;apply_pending_deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;is_validator_exited&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# Validator is exiting, postpone the deposit until after withdrawable epoch
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;deposits_to_postpone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# Check if deposit fits in the churn, otherwise, do no more deposit processing in this epoch.
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;is_churn_limit_reached&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;processed_amount&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;amount&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;available_for_processing&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;is_churn_limit_reached&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# Consume churn and apply deposit.
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;processed_amount&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;amount&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;apply_pending_deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deposit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Regardless of how the deposit was handled, we move on in the queue.
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;next_deposit_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pending_deposits&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pending_deposits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next_deposit_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deposits_to_postpone&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Accumulate churn only if the churn limit has been hit.
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;is_churn_limit_reached&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deposit_balance_to_consume&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;available_for_processing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;processed_amount&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deposit_balance_to_consume&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;exit-processing&quot;&gt;Exit processing&lt;/h3&gt;

&lt;p&gt;We replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_activation_exit_churn_limit&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_exit_churn_limit&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;compute_exit_epoch_and_update_churn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BeaconState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exit_balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gwei&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;earliest_exit_epoch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;earliest_exit_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;compute_activation_exit_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_current_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# [Modified in Gloas:EIP-8061]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;per_epoch_churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_exit_churn_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# New epoch for exits.
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;earliest_exit_epoch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;earliest_exit_epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;exit_balance_to_consume&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;per_epoch_churn&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;exit_balance_to_consume&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exit_balance_to_consume&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Exit doesn&apos;t fit in the current earliest epoch.
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exit_balance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exit_balance_to_consume&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;balance_to_process&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exit_balance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exit_balance_to_consume&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;additional_epochs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;balance_to_process&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;per_epoch_churn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;earliest_exit_epoch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;additional_epochs&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;exit_balance_to_consume&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;additional_epochs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;per_epoch_churn&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Consume the balance and update state variables.
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exit_balance_to_consume&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exit_balance_to_consume&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exit_balance&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;earliest_exit_epoch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;earliest_exit_epoch&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;earliest_exit_epoch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Independent parameters:&lt;/strong&gt; a separate churn consolidation is easy to independently tune, in particular adjusted upward if we want to speed up the consolidation process further, and later downward, when the primary wave of validator set consolidation has already happened and the consolidation operation becomes less crucial.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scaling with stake&lt;/strong&gt;: the exit churn regains proportionality to the total stake, and the consolidation churn maintains it.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Preserving the activation cap&lt;/strong&gt;: the activation churn limit maintains the cap from &lt;a href=&quot;/EIPS/eip-7514&quot;&gt;EIP-7514&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Balancing security and functionality&lt;/strong&gt;: the exit churn limit is increased by ~4x compared to the current cap, and exactly 2x compared to previous uncapped version, while the consolidation churn limit is increased by ~2x. Activations remain capped at the existing limit. As we see later in more detail, accounting for the asymmetric impact of exits and activations on safety degradation, this results in a decrease of the weak subjectivity period from ~15.7 days to ~7 days (see detailed calculations below), or ~6 days if we were to later remove the activation cap, in either case still on the order of a week. Moreover, were consolidations to be removed later, the weak subjectivity period would go up to ~11 days, or ~8.4 days without the activation cap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP introduces a backwards-incompatible change to the consensus rules and MUST be activated as part of a scheduled network upgrade.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;h3 id=&quot;weak-subjectivity-period&quot;&gt;Weak subjectivity period&lt;/h3&gt;

&lt;p&gt;Let &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MIN_VALIDATOR_WITHDRAWABILITY_DELAY = 256&lt;/code&gt; epochs, and let $S$ denote the total stake, $E$ the exit churn per epoch, $A$ the activation churn per epoch, and $C$ the consolidation churn per epoch. Each unit of exit churn contributes to a safety degradation (measured in ETH, as the churn) of $\frac{4}{3}$, whereas the safety degradation from activations is only $\frac{2}{3}$ per unit. Finally, it is $2$ per unit for consolidations, as a consolidation is the equivalent of an exit and an activation.&lt;/p&gt;

&lt;p&gt;The formula to compute the weak subjectivity period (in epochs) for a 10% safety decay target (exactly corresponding to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute_weak_subjectivity_period&lt;/code&gt;) then is:&lt;/p&gt;

&lt;p&gt;$\text{WS}_{\text{epochs}} = 256 +
\frac{0.1 \cdot S}{\frac{4}{3} \cdot E + \frac{2}{3} \cdot A + 2 \cdot C}$&lt;/p&gt;

&lt;p&gt;The churn limits of the current protocol, assuming a total stake $S = 36M$ ETH (approximately the stake at the time of writing) are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;$A = E = \min(256, S/2^{16}) = 256$ ETH (capped)&lt;/li&gt;
  &lt;li&gt;$C = S/2^{16} - A \approx 293$ ETH&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The weak subjectivity period is then:&lt;/p&gt;

&lt;p&gt;$\text{WS}_{\text{epochs}} \approx 3533$&lt;/p&gt;

&lt;p&gt;$\Rightarrow\ \textbf{WS} \approx \mathbf{15.7\ \text{days}}$&lt;/p&gt;

&lt;p&gt;In days, it is $\text{WS}_{\text{epochs}} / 225$.&lt;/p&gt;

&lt;p&gt;Under this EIP, and assuming a total stake $S = 36M$ ETH:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;$E = S/2^{15} \approx 1098$ ETH&lt;/li&gt;
  &lt;li&gt;$A = \min(256, S/2^{15}) = 256$ ETH (capped)&lt;/li&gt;
  &lt;li&gt;$C = S/2^{16} \approx 549$ ETH&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The weak subjectivity period is then:&lt;/p&gt;

&lt;p&gt;$\text{WS}_{\text{epochs}} \approx 1573$&lt;/p&gt;

&lt;p&gt;$\Rightarrow\ \textbf{WS} \approx \mathbf{7.0\ \text{days}}$&lt;/p&gt;

&lt;p&gt;Other possible future scenarios are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Activation cap removed: $\textbf{WS} \approx \mathbf{6.0\ \text{days}}$ ($\text{WS}_{\text{epochs}} \approx 1348$)&lt;/li&gt;
  &lt;li&gt;Consolidations disabled: $\textbf{WS} \approx \mathbf{10.9\ \text{days}}$ ($\text{WS}_{\text{epochs}} \approx 2457$)&lt;/li&gt;
  &lt;li&gt;Consolidations disabled and activation cap removed: $\textbf{WS} \approx \mathbf{8.4\ \text{days}}$ ($\text{WS}_{\text{epochs}} \approx 1894$)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that removing the activation cap only reduces the weak subjectivity period by one day, and leaves it on the order of a week. The current parameters might then also be considered acceptable in a future where it is decided to remove the activation cap.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 17 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8061</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8061</guid>
      </item>
      
      
    
      
      
      
    
      
    
      
    
      
      
      
      <item>
        <title>Upgrade Mascots</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8066 - Upgrade Mascots&lt;/strong&gt; is in Last Call status. It is authored by Jordan Holberg (@eviljordan), Andrew B Coathup (@abcoathup) and was originally created 2025-10-29. It is in the  category of type Informational. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8066-upgrade-mascots/26009&quot;&gt;https://ethereum-magicians.org/t/eip-8066-upgrade-mascots/26009&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP establishes a mascot for each Ethereum network upgrade. Mascots serve to humanize and celebrate upgrades, fostering community engagement while adhering to principles of cuteness, relevance, and inclusivity. The mascot is selected through community-driven processes, with safeguards for appropriateness, by a designated facilitator (the “Mascot Wrestler”).&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;Ethereum network upgrades often introduce complex technical changes that can feel abstract to the broader community. Mascots provide a fun, memorable, and relatable symbol for each upgrade, drawing inspiration from its headliners, the namesakes of its layer names, or its client interop events. By mandating emoji-representable mascots that are cute and non-offensive, this process:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Enhances community participation and excitement around network upgrades.&lt;/li&gt;
  &lt;li&gt;Creates opportunities for creative expression in upgrade event branding (e.g., watch parties, attendance NFTs).&lt;/li&gt;
  &lt;li&gt;Builds a consistent, whimsical tradition that differentiates Ethereum’s upgrade narrative from other ecosystems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119 and RFC 8174.&lt;/p&gt;

&lt;h3 id=&quot;1-mascot-requirements&quot;&gt;1. Mascot Requirements&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Relevance&lt;/strong&gt;: The mascot &lt;strong&gt;MUST&lt;/strong&gt; relate thematically to one or more of the network upgrade’s headliners, the namesakes of the network upgrade’s layer names (e.g., the execution layer city or the consensus layer star), or the client interop events for the network upgrade.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Representation&lt;/strong&gt;: The mascot &lt;strong&gt;MUST&lt;/strong&gt; be expressible using one or more standard Unicode emojis (e.g., 🐼 for the Merge).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Form&lt;/strong&gt;: The mascot &lt;strong&gt;SHOULD&lt;/strong&gt; depict an animal (real, mythical, or stylized, but always animal-adjacent).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tone&lt;/strong&gt;: The mascot &lt;strong&gt;MUST NOT&lt;/strong&gt; be offensive (no depictions of violence, discrimination, or controversy) and &lt;strong&gt;SHOULD&lt;/strong&gt; be inherently cute (e.g., avoiding aggressive or fearsome traits unless softened for adorability).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-roles-and-responsibilities&quot;&gt;2. Roles and Responsibilities&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Mascot Wrestler&lt;/strong&gt;: A self-selected community facilitator responsible for proposing, selecting, and adopting the mascot for a network upgrade. The role &lt;strong&gt;MAY&lt;/strong&gt; rotate voluntarily per upgrade cycle to encourage diverse participation.
    &lt;ul&gt;
      &lt;li&gt;Duties include:
        &lt;ul&gt;
          &lt;li&gt;Soliciting and curating mascot candidates.&lt;/li&gt;
          &lt;li&gt;Facilitating selection processes.&lt;/li&gt;
          &lt;li&gt;Announcing the final mascot (e.g., Ethereum Magicians, All Core Devs).&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Veto Powers&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;The Mascot Wrestler &lt;strong&gt;MAY&lt;/strong&gt; veto any candidate mascot not meeting the mascot requirements above.&lt;/li&gt;
      &lt;li&gt;A rough consensus of client teams &lt;strong&gt;MAY&lt;/strong&gt; veto the selected mascot, triggering fallback to the next-highest-ranked candidate mascot.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-selection-process&quot;&gt;3. Selection Process&lt;/h3&gt;

&lt;p&gt;The Mascot Wrestler &lt;strong&gt;SHALL&lt;/strong&gt; conduct selection using one or more community-appropriate mechanisms.&lt;/p&gt;

&lt;p&gt;The process &lt;strong&gt;MUST&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Run for a minimum of 7 days.&lt;/li&gt;
  &lt;li&gt;Present at least 2 candidates.&lt;/li&gt;
  &lt;li&gt;Rank finalists by popularity.&lt;/li&gt;
  &lt;li&gt;Document results publicly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If no consensus is reached, the Mascot Wrestler selects the top candidate by default, subject to veto.&lt;/p&gt;

&lt;h3 id=&quot;4-usage-guidelines&quot;&gt;4. Usage Guidelines&lt;/h3&gt;

&lt;p&gt;All uses &lt;strong&gt;MUST&lt;/strong&gt; respect the network upgrade mascot’s cute, non-offensive nature and credit original concept creators where applicable.&lt;/p&gt;

&lt;p&gt;Mascots exist to celebrate network upgrades and &lt;strong&gt;SHOULD NOT&lt;/strong&gt; be used to promote speculative tokens (e.g., meme coins).&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;This specification balances creativity with guardrails to prevent mascot drift (e.g., unrelated or edgy choices). Emoji-based representation ensures accessibility across digital platforms, while the animal/cute mandate aligns with Ethereum’s community ethos of approachability. The self-selected Mascot Wrestler role decentralizes coordination, leveraging vetoes for accountability. Selection flexibility accommodates Ethereum’s decentralized governance evolution.&lt;/p&gt;

&lt;p&gt;Alternatives considered:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Fully onchain mandates: Too rigid for creative processes.&lt;/li&gt;
  &lt;li&gt;No formal process: Risks ad-hoc or absent mascots.&lt;/li&gt;
  &lt;li&gt;Non-animal options: Animals evoke universality and whimsy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP does not directly change the Ethereum protocol. It formalizes part of the current network upgrade process.  Past upgrades (e.g., Shapella’s owl 🦉) are retroactively honored if they fit the criteria; future upgrades &lt;strong&gt;MUST&lt;/strong&gt; comply starting with the next hard fork post-adoption.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;None&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Wed, 29 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8066</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8066</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>eth/72 - Sparse Blobpool</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8070 - eth/72 - Sparse Blobpool&lt;/strong&gt; is in Last Call status. It is authored by Raúl Kripalani (@raulk), Bosul Mun (@healthykim), Francesco D&apos;Amato (@fradamt), Csaba Kiraly (@cskiraly), Felix Lange (@fjl), Marios Ioannou (@mariosioannou-create), Alex Stokes (@ralexstokes), Kamil Salakhiev (@kamilsa) and was originally created 2025-10-29. It is in the Networking category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8070-sparse-blobpool/26023&quot;&gt;https://ethereum-magicians.org/t/eip-8070-sparse-blobpool/26023&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This proposal introduces the sparse blobpool, a construction that brings cell-level, custody-aligned sampling in the Execution Layer (EL). For every new type 3 (blob-carrying) transaction, an EL node fetches full blob payloads only with probability p = 0.15, and otherwise it merely samples the blobs, using the same custody assignment as its Consensus Layer (CL) counterpart. For validators, this means downloading as little as 1/8 of the data (8 out of 64 cells), so that the average bandwidth consumption compared to the (current) full blobpool is 0.15 + 0.85/8 ~ 0.25, a ~4x reduction. The choice of p = 0.15 balances reducing bandwidth consumption with guaranteeing the full propagation of txs, by ensuring that for each blob tx there exists a large connected backbone of nodes that have the full blob payload. At an individual node level, p = 0.15 translates to 98.6% probability of least 3/50 neighbours holding the full blob payload, only 0.03% chance of total unavailability. The sampling performed with probability 1 - p = 0.85 enables streamlined data availability checks during block validation, as well as enhancing the availability of the data.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;As Blob Parameter Only (BPO) forks progressively increase throughput, the full-replication nature of today’s EL blobpool will begin dominating bandwidth utilization, causing us to hit &lt;a href=&quot;/EIPS/eip-7870&quot;&gt;EIP-7870&lt;/a&gt; limits. Furthermore, this traffic will compete, and potentially starve, block and attestation propagation, risking instability and liveness issues. This behavior has already been observed in Fusaka devnets, where the average bandwidth consumption &lt;em&gt;of a full node&lt;/em&gt; is dominated by the EL blobpool, since column propagation on the CL benefits from sampling.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/eip-8070/bandwidth-breakdown-fusaka-devnets.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure 1.&lt;/strong&gt; &lt;em&gt;Breakdown of the average bandwidth consumption (download) of full nodes in Fusaka Devnet 5, for blob count target/max of 22/33 (left) and 48/72 (right). The average bandwidth consumption of the EL is ~4-5x that of the CL.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While the average bandwidth consumption does not reflect that the load on the EL is spread out over time rather than concentrated in a small time window as it is in the CL, the gap between the EL and CL is quite large (~4-5x), and future upgrades will enable the CL to better spread out data propagation in the slot, leaving the EL blobpool as even more of a bottleneck.&lt;/p&gt;

&lt;p&gt;The sparse blobpool mechanism brings sampling to the EL as well, with an anticipated ~4x reduction in average bandwidth consumption for a given blobpool load. In doing so, it preserves the unstructured, stochastic nature of the current blobpool rather than introducing complex sharding architectures, prioritizing simplicity and resilience. Moreover, it preserves the CL’s ability to satisfy its own sampling needs with the pre-propagated data in the EL blobpool (through the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getBlobs&lt;/code&gt; Engine API). This is achieved by aligning the EL and CL sampling, in particular by having the EL fetch the cells corresponding to the CL custody set. This preserves a key feature of the blobpool, as it stretches the time window for blob data propagation, offloading this work from the critical path of block validation and leading to smoother and less bursty bandwidth utilization patterns over time.&lt;/p&gt;

&lt;p&gt;While the scalability gain may be more modest than with other solutions, we believe this design balances between simplicity, security, and scalability, in order to unlock the next tier of blob throughput without requiring user-facing changes, or deeper architectural redesigns.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc2119&quot;&gt;RFC 2119&lt;/a&gt; and &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8174&quot;&gt;RFC 8174&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;execution-clients--devp2p-changes&quot;&gt;Execution clients :: devp2p changes&lt;/h3&gt;

&lt;p&gt;We introduce a new devp2p protocol version, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/72&lt;/code&gt; extending the existing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/71&lt;/code&gt; protocol.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NewPooledTransactionHashes&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x08&lt;/code&gt;) message.&lt;/strong&gt;
Add a new field &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cell_mask&lt;/code&gt; of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B_16&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint128&lt;/code&gt;). This field MUST be interpreted as a bitarray of length &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CELLS_PER_EXT_BLOB&lt;/code&gt;, carrying &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; in the indices of columns the announcer has available for &lt;strong&gt;all type 3 txs announced within the message&lt;/strong&gt;. This field MUST be set to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nil&lt;/code&gt; when no transactions of such type are announced. (TODO: this approach is not expressive enough if the node wants to offer randomly sampled columns, nor if it wants to announce transactions with full and partial availability in a single message).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;old schema (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/71&lt;/code&gt;): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[types: B, [size_0: P, size_1: P, ...], [hash_0: B_32, hash_1: B_32, ...]]&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;new schema (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/72&lt;/code&gt;): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[types: B, [size_0: P, size_1: P, ...], [hash_0: B_32, hash_1: B_32, ...], cell_mask: B_16]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Modify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetPooledTransactions&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x09&lt;/code&gt;) / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PooledTransactions&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x0a&lt;/code&gt;) behaviour.&lt;/strong&gt;
Responses MUST elide blob payloads for type 3 transactions requested via this RPC by encoding the transaction’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blobs&lt;/code&gt; field as the RLP empty list (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xc0&lt;/code&gt;, the encoding of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[]&lt;/code&gt;). The field MUST NOT be encoded as the RLP empty byte string (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x80&lt;/code&gt;). Cell proofs and commitments are unaffected and continue to be sent.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;old schema (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/71&lt;/code&gt;): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[request_id: P, [tx_0, tx_1, ...]]&lt;/code&gt;, where type 3 transactions are encoded as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x03 || rlp([tx_payload_body, wrapper_version, blobs, commitments, cell_proofs])&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;new schema (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/72&lt;/code&gt;): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[request_id: P, [tx_0, tx_1, ...]]&lt;/code&gt;, where type 3 transactions are encoded as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x03 || rlp([tx_payload_body, wrapper_version, [], commitments, cell_proofs])&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;New message type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetCells&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x14&lt;/code&gt;).&lt;/strong&gt; Used to request cells for type 3 transactions. It specifies the transaction hashes being requested, along with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cell_mask&lt;/code&gt; specifying which cell indices are needed, with syntax identical as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cell_mask&lt;/code&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NewPooledTransactionHashes&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/72&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[hash_0: B_32, hash_1: B_32, ...], cell_mask: B_16]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;New message type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cells&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x15&lt;/code&gt;).&lt;/strong&gt; Used to respond to a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetCells&lt;/code&gt; requests.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/72&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[hash_0: B_32, hash_1: B_32, ...], cells: [[cell_0_0: B_2048, cell_0_1: B_2048, ...], [cell_1_0: B_2048, cell_1_1: B_2048, ...]], cell_mask: B_16]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;execution-clients--blobpool-behavior&quot;&gt;Execution clients :: Blobpool behavior&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;New transaction hash.&lt;/strong&gt;
Upon receiving a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NewPooledTransactionHashes&lt;/code&gt; announcement containing a previously unknown type 3 transaction hash, the node makes a probabilistic decision about fetching the blob payload: it decides to fetch the full blob payload with probability p = 0.15 (provider role), or simply sample otherwise (sampler role). This decision MAY be remembered for some period chosen by the implementer, in which case stateless heuristics are RECOMMENDED (e.g. calculating a hash by appending some time-bound value mixed in with stable transaction properties, and applying p to it).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider role.&lt;/strong&gt;
If the node is a provider, and the announcing peer signaled full availability, the node MUST request the signed transaction and full blob data from that peer via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetPooledTransactions&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetCells&lt;/code&gt; with an all-ones &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cell_mask&lt;/code&gt; bitmap. Upon successful retrieval and validation (as per &lt;a href=&quot;/EIPS/eip-7594&quot;&gt;EIP-7594&lt;/a&gt;), the node MUST in turn announce the transaction hash to its peers via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NewPooledTransactionHashes&lt;/code&gt;, also with an all-ones &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cell_mask&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sampler role.&lt;/strong&gt;
If the node is a sampler, the node MUST only request the transaction payload via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetPooledTransactions&lt;/code&gt;. It SHOULD await to observe at least 2 distinct provider announcements, and to successfully receive and validate the signed transaction, before acting further. It then MUST request custody-aligned cells from peers that announced overlapping availability, including providers. When fetching from a provider, the node MUST request &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C_extra&lt;/code&gt; random columns in addition to its custody set (see “Sampling noise” in Rationale). The responder MAY truncate its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cells&lt;/code&gt; response depending on its current capacity, returning fewer cells than requested.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ensuring fairness.&lt;/strong&gt;
Nodes MAY keep a record of the frequency of full payload fetches made by each peer, relative to their sampling requests. Nodes MAY elect to disconnect peers who exceed some locally-determined fairness heuristic. Such heuristics are not object of standardization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supernode behaviour.&lt;/strong&gt;
Supernodes (nodes intending to fetch every blob payload in full) MUST load balance requests across samplers and providers. Furthermore, supernodes SHOULD prioritize reconstructing blobs and proofs from 64 columns. Supernodes SHOULD maintain a larger peerset in order to satisfy their increased blob fetching needs without over-stressing a small set of neighbours and violating fairness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sampler eviction&lt;/strong&gt;
A sampler MAY drop a transaction if it has not observed sufficient network saturation (i.e., announcements from other peers for the same blob) within a defined period.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continued sampling&lt;/strong&gt;
Tenured transactions MAY be subject to resampling in order to test for liveness and confirm confidence of continued network-wide availability.&lt;/p&gt;

&lt;h3 id=&quot;execution-clients--local-block-builders&quot;&gt;Execution clients :: Local block builders&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Eager mode for block builders.&lt;/strong&gt;
By default block builder &lt;strong&gt;SHOULD&lt;/strong&gt; permanently act in eager mode: it acts as a provider (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;p = 1.0&lt;/code&gt;) for every type 3 transaction it intends to include, fetching the full blob payload. This guarantees that the builder holds complete blob data for all transactions in the payload.&lt;/p&gt;

&lt;p&gt;A builder &lt;strong&gt;MAY&lt;/strong&gt; choose to act as a provider with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;p = 0.15&lt;/code&gt; probability, and switch to eager mode 2-3 slots prior to block building. But this is not recommended as this creates a clear pattern for the builder’s networking behavior and compromises its privacy, increasing the risk of DoS attacks against it.&lt;/p&gt;

&lt;h3 id=&quot;engine-api-extensions&quot;&gt;Engine API extensions&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Method &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_forkchoiceUpdatedV4&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This EIP extends &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_forkchoiceUpdatedV4&lt;/code&gt; as defined in the Amsterdam Engine API specification by adding an optional &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;custodyColumns&lt;/code&gt; parameter, allowing the CL to inform the EL of its current blob column custody set.&lt;/p&gt;

&lt;p&gt;Request:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;method: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_forkchoiceUpdatedV4&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;params:
    &lt;ol&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;forkchoiceState&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ForkchoiceStateV1&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;payloadAttributes&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Object|null&lt;/code&gt; - Instance of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PayloadAttributesV4&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;custodyColumns&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATA|null&lt;/code&gt; - 16-byte value interpreted as a bitarray of length &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CELLS_PER_EXT_BLOB&lt;/code&gt;, where a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; at position &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt; indicates the CL node has custody of column &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt; if the CL is unable to provide an update.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;timeout: 8s&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Response:&lt;/p&gt;

&lt;p&gt;Refer to the response for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_forkchoiceUpdatedV3&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Specification:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;CL MUST include a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;custodyColumns&lt;/code&gt; value after startup or when its columns custody set changes. It MUST also resend it after any Engine API interruption or reconnection.&lt;/li&gt;
  &lt;li&gt;EL MUST return an Ok response if the request is well-formed. All subsequent sampling requests MUST adopt the new custody set. Queued sampling requests MAY be patched to reflect the new custody set.&lt;/li&gt;
  &lt;li&gt;For type 3 transactions pending in the blobpool:
    &lt;ol&gt;
      &lt;li&gt;If the custody set has expanded relative to the previously known set, the Execution client MUST issue new sampling requests for the delta columns. It SHOULD broadcast updated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NewPooledTransactionHashes&lt;/code&gt; announcements reflecting the expanded available set when act as a sampler.&lt;/li&gt;
      &lt;li&gt;If the custody set has contracted, the Execution client MAY prune dropped cells from local storage, but only AFTER broadcasting an updated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NewPooledTransactionHashes&lt;/code&gt; announcement with the reduced available set, to avoid peers perceiving availability fault.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;The Execution client MUST treat a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;custodyColumns&lt;/code&gt; value identical to the current custody set or a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt; value as a no-op with respect to blobpool state, while still processing the rest of the forkchoice update normally.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Method &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_getBlobsV4&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Called by the Consensus layer client to retrieve blob cells from the Execution layer blobpool.&lt;/p&gt;

&lt;p&gt;Request:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;method: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;engine_getBlobsV4&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;params:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;versioned_blob_hashes&lt;/code&gt;: []bytes32, an array of blob versioned hashes.&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;indices_bitarray&lt;/code&gt;: uint128, a bitarray denoting the indices of the cells to retrieve.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;timeout: 500ms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Response:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;result: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[]BlobCellsAndProofsV1&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;error: code and message set in case an error occurs during processing of the request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Data structure &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlobCellsAndProofsV1&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blob_cells&lt;/code&gt;: a sequence of byte arrays &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[]bytes&lt;/code&gt; representing the partial matrix of the requested blobs, with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nil&lt;/code&gt; entries for missing cells.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proofs&lt;/code&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Array of DATA&lt;/code&gt; - Array of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KZGProof&lt;/code&gt; as defined in &lt;a href=&quot;/EIPS/eip-4844&quot;&gt;EIP-4844&lt;/a&gt;, 48 bytes each (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATA&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;parameters&quot;&gt;Parameters&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Fetching probability&lt;/strong&gt;: p = 0.15&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Mesh degree&lt;/strong&gt;: D = 50 (default peerset size)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Sampling requirement&lt;/strong&gt;: Minimum &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SAMPLES_PER_SLOT = 8&lt;/code&gt; columns per node as per PeerDAS specification&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reconstruction threshold&lt;/strong&gt;: 64 cells required for Reed-Solomon decoding&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Minimum providers to sample&lt;/strong&gt;: minimum 2 providers should be observed before sampling&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Extra random columns per request&lt;/strong&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C_extra = 1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;parameter-selection&quot;&gt;Parameter selection&lt;/h3&gt;

&lt;p&gt;The choice of p = 0.15 balances bandwidth reduction with availability guarantees. Mathematical analysis for a mesh degree D = 50 shows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Primary reliability&lt;/strong&gt;: Probability of having at least 3 peers with complete blob payload is 98.6%&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Secondary reliability&lt;/strong&gt;: Via reconstruction from partial availability, recovery probability exceeds 80% when 6+ provider peers exist.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Total unavailability&lt;/strong&gt;: Only 0.03% chance with these parameters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;reliability-framework&quot;&gt;Reliability framework&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Primary reliability.&lt;/strong&gt; Let $X$ be the number of direct peers with the full payload. With $X∼Binomial(D,p)$, the probability that at least $k$ honest peers hold the full blob payload for a type 3 tx is:&lt;/p&gt;

\[P(X \geq k) = 1 - \sum_{i=0}^{k-1} \binom{D}{i} p^i (1-p)^{D-i}\]

&lt;p&gt;Evaluating for sensible values of $p$ and $k$ yields, where $D=50$ (Geth’s default mesh degree):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;$p$&lt;/th&gt;
      &lt;th&gt;$k = 6$&lt;/th&gt;
      &lt;th&gt;$k = 5$&lt;/th&gt;
      &lt;th&gt;$k = 4$&lt;/th&gt;
      &lt;th&gt;$k = 3$&lt;/th&gt;
      &lt;th&gt;$k = 2$&lt;/th&gt;
      &lt;th&gt;$k = 1$&lt;/th&gt;
      &lt;th&gt;$P(0)$&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;0.05&lt;/td&gt;
      &lt;td&gt;0.037776&lt;/td&gt;
      &lt;td&gt;0.103617&lt;/td&gt;
      &lt;td&gt;0.239592&lt;/td&gt;
      &lt;td&gt;0.459467&lt;/td&gt;
      &lt;td&gt;0.720568&lt;/td&gt;
      &lt;td&gt;0.923055&lt;/td&gt;
      &lt;td&gt;0.076945&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.08&lt;/td&gt;
      &lt;td&gt;0.208126&lt;/td&gt;
      &lt;td&gt;0.371050&lt;/td&gt;
      &lt;td&gt;0.574704&lt;/td&gt;
      &lt;td&gt;0.774026&lt;/td&gt;
      &lt;td&gt;0.917288&lt;/td&gt;
      &lt;td&gt;0.984534&lt;/td&gt;
      &lt;td&gt;0.015466&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.10&lt;/td&gt;
      &lt;td&gt;0.383877&lt;/td&gt;
      &lt;td&gt;0.568802&lt;/td&gt;
      &lt;td&gt;0.749706&lt;/td&gt;
      &lt;td&gt;0.888271&lt;/td&gt;
      &lt;td&gt;0.966214&lt;/td&gt;
      &lt;td&gt;0.994846&lt;/td&gt;
      &lt;td&gt;0.005154&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.125&lt;/td&gt;
      &lt;td&gt;0.606513&lt;/td&gt;
      &lt;td&gt;0.765366&lt;/td&gt;
      &lt;td&gt;0.886232&lt;/td&gt;
      &lt;td&gt;0.958237&lt;/td&gt;
      &lt;td&gt;0.989739&lt;/td&gt;
      &lt;td&gt;0.998740&lt;/td&gt;
      &lt;td&gt;0.001260&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;0.15&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;0.780647&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;0.887895&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;0.953953&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;0.985811&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;0.997095&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;0.999704&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;0.000296&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.20&lt;/td&gt;
      &lt;td&gt;0.951973&lt;/td&gt;
      &lt;td&gt;0.981504&lt;/td&gt;
      &lt;td&gt;0.994344&lt;/td&gt;
      &lt;td&gt;0.998715&lt;/td&gt;
      &lt;td&gt;0.999807&lt;/td&gt;
      &lt;td&gt;0.999986&lt;/td&gt;
      &lt;td&gt;0.000014&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Secondary reliability.&lt;/strong&gt; Probability that a payload can be reconstructed from partial availability when primary reliability fails. Let $Y$ be the number of distinct columns available from sampler peers. Given $k$ provider peers that failed to serve the full payload, a node with $D - k$ sampler peers (each holding 8 random columns, assuming they’re all minimal custody full nodes) can reconstruct with probability $P(Y \geq 64 \mid n = D - k)$. For the adversarial scenario where we attained $k = 3$, yet all failed to serve the blob data, with $D = 50$, secondary reliability exceeds 99.9% as samplers provide an expected 124 distinct columns from 47 peers.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Providers ($k$)&lt;/th&gt;
      &lt;th&gt;Samplers ($n=D-k$)&lt;/th&gt;
      &lt;th&gt;$E[Distinct Columns]$&lt;/th&gt;
      &lt;th&gt;$P(Y ≥ 64)$&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;50&lt;/td&gt;
      &lt;td&gt;125.1&lt;/td&gt;
      &lt;td&gt;&amp;gt;99.99%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;49&lt;/td&gt;
      &lt;td&gt;124.9&lt;/td&gt;
      &lt;td&gt;&amp;gt;99.99%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;48&lt;/td&gt;
      &lt;td&gt;124.6&lt;/td&gt;
      &lt;td&gt;&amp;gt;99.99%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;47&lt;/td&gt;
      &lt;td&gt;124.3&lt;/td&gt;
      &lt;td&gt;&amp;gt;99.99%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;46&lt;/td&gt;
      &lt;td&gt;124.0&lt;/td&gt;
      &lt;td&gt;&amp;gt;99.99%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;…&lt;/td&gt;
      &lt;td&gt;…&lt;/td&gt;
      &lt;td&gt;…&lt;/td&gt;
      &lt;td&gt;…&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;~40&lt;/td&gt;
      &lt;td&gt;~10&lt;/td&gt;
      &lt;td&gt;~68&lt;/td&gt;
      &lt;td&gt;~80%&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Minimum threshold&lt;/strong&gt;: Approximately $n_{\min} \approx 10$ samplers needed for reasonable reconstruction probability (&amp;gt;80%).&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP changes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth&lt;/code&gt; protocol and requires rolling out a new version, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/72&lt;/code&gt;. Supporting multiple versions of a wire protocol is possible. Rolling out a new version does not break older clients immediately, since they can keep using protocol version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/71&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This EIP does not change consensus rules and does not strictly require a hard fork. We are assessing the gradual rollout possibilities. In the meantime, it is RECOMMENDED that this EIP be deployed within the context of a hard fork.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;p&gt;TBD&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;h3 id=&quot;attack-scenarios-and-threat-model&quot;&gt;Attack scenarios and threat model&lt;/h3&gt;

&lt;p&gt;The goal of threat modeling is to identify potential attack vectors and vulnerabilities in the proposed sparse blobpool mechanism that may hurt the security, availability, or integrity of the type 3 transaction propagation. The threat model assumes a permissionless environment where adversaries can freely join the network, create multiple identities (Sybil attacks), and behave maliciously. Adversaries may aim to disrupt the network, degrade performance, censor transactions, or manipulate the availability of blob data. Below are some potential attack scenarios and their implications:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DoS attacks.&lt;/strong&gt; An important consideration in all mempool sharding mechanisms is the possibility of DoS attacks. This refers to the case where a malicious sender posts a transaction to the mempool disclosing only part of it, which makes the transaction impossible to be included in any future block, while still consuming mempool resources. In this system, such a sender can be detected by nodes that request the full payload of the transaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Selective withholding attacks.&lt;/strong&gt; A malicious peer might selectively withhold full blob data for certain type 3 transactions (e.g. produced by a certain L2), thus slowing down their propagation and potentially leading to reduced availability. This can be mitigated by ensuring a sufficiently large and diverse peerset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eclipse attacks.&lt;/strong&gt; Malicious peers can try to isolate a victim node by controlling all its connections, serving only partial blob data and preventing it from obtaining the full payload. This hurts the victim’s ability to propagate transactions and can lead to reduced availability of blob data and potential censorship of the honest peer. However, periodic rotation of connections and keeping track of neighbor peer’s rate of full payload announcements can help mitigate this attack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free rider attacks.&lt;/strong&gt; A peer can send an excessive volume of blob data requests without reciprocating with announcements, thus consuming bandwidth without contributing to the network. This can be mitigated by keeping track of the requests to announcements ratio of peers and disconnecting those that exceed a certain threshold.&lt;/p&gt;

&lt;h3 id=&quot;peer-disconnection-policies&quot;&gt;Peer disconnection policies&lt;/h3&gt;

&lt;p&gt;Nodes MAY keep a record of the frequency of full payload and column requests made by each peer. If a frequency exceeds some quota or the probabilistic expectation by some tolerance threshold, the node MAY decide to disconnect the offending peer alleging abuse as a reason. This prevents nodes from spending too much upload bandwidth on peers that fetch full payloads much more often that the expected p = 0.15.&lt;/p&gt;

&lt;h3 id=&quot;the-need-for-sampling-noise&quot;&gt;The need for sampling noise&lt;/h3&gt;

&lt;p&gt;Custody-aligned sampling generates in stable and predictable request patterns that attackers could game. For example, a malicious node may trick a victim by pretending to be a provider when in reality it only stores the few, predictable columns the victim is expected to sample. To defend against this, this EIP introduces the simple mechanism of “sampling noise.”&lt;/p&gt;

&lt;p&gt;When a peer requests its custody columns from a provider, it must also request at least ONE randomly selected column. A failure to serve this extra column can be interpreted as a strong sign of misbehavior. The attacker could choose to timeout, but after a number of repetitions, the victim would likely disconnect anyway due to high failure rates.&lt;/p&gt;

&lt;p&gt;This simple mechanism reinforces key model assumptions (a provider is truly a provider) in exchange for negligible overhead per request (MAX_BLOBS_PER_TX x CELL_SIZE + proofs = ~12KiB).&lt;/p&gt;

&lt;h3 id=&quot;no-normative-peer-scoring&quot;&gt;No normative peer scoring&lt;/h3&gt;

&lt;p&gt;An earlier design considered a peer scoring system to grade peers by tracking their statistical ratio of requests to announcements (leechiness vs. helpfulness). After careful consideration, we deemed this approach brittle and dropped the feature. Our rationale was that such mechanism would strongly encode assumptions and confine the system to conform to some modellic behaviour, thus reducing flexibility and resilience in the face of environmental changes, shocks, or unexpected/improbable events (properties that are crucial in open and permissionless systems). Instead, we defer to implementations to define their own local heuristics for peer disconnection, if any.&lt;/p&gt;

&lt;h3 id=&quot;devp2p-message-schema-choices&quot;&gt;devp2p message schema choices&lt;/h3&gt;

&lt;p&gt;We note that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cell_mask&lt;/code&gt; field in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NewPooledTransactionHashes&lt;/code&gt; is not expressive enough to signal different local availability for type 3 txs announced within the same message. This limitation implies that (a) fully and partially available txs cannot be announced together, and (b) availability of randomly sampled columns cannot be signaled in practice (because indices vary per tx), only custody columns can be consistently announced (they’re shared across all sampled transactions).&lt;/p&gt;

&lt;p&gt;Nevertheless, the sender can efficiently split and group announcements: fully-available txs can be bundled together, and partially-available txs can be announced in separate messages. Per-message dispatch overhead is minimal (one uint64 request_id and one uint8 message_type), and more expressive designs are likely to incur in higher overhead. Furthermore, from a protocol flow perspective, devp2p supports concurrent requests and unordered responses (via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;request_id&lt;/code&gt; correlation), so this approach is not affected by head-of-line blocking either (at least from a protocol perspective).&lt;/p&gt;

&lt;p&gt;We considered more expressive designs, ranging from simple arrays of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cell_mask&lt;/code&gt;s (one per tx), to union types express full availability more compactly, to more complex schemes involving run-length encoding and compression. But we concluded that the added complexity was not justified at this time.&lt;/p&gt;

&lt;h3 id=&quot;open-points&quot;&gt;Open points&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Further threat modelling and security hardening.&lt;/li&gt;
  &lt;li&gt;RBF (replace-by-fee) impact.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Wed, 29 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8070</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8070</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>Cell-Level Deltas for Data Column Broadcast</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8136 - Cell-Level Deltas for Data Column Broadcast&lt;/strong&gt; is in Last Call status. It is authored by Marco Munizaga (@MarcoPolo) &lt;git@marcopolo.io&gt;, Daniel Knopik (@dknopik) &lt;daniel@dknopik.de&gt;, Sukun Tarachandani (@sukunrt) &lt;sukunrt@gmail.com&gt;, Aarsh Shah (@aarshkshah1992) &lt;aarshkshah1992@gmail.com&gt; and was originally created 2025-01-23. It is in the Networking category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8136-cell-level-deltas-for-data-column-broadcast/27675&quot;&gt;https://ethereum-magicians.org/t/eip-8136-cell-level-deltas-for-data-column-broadcast/27675&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Cell-Level Deltas for Data Column Broadcast optimizes PeerDAS (&lt;a href=&quot;/EIPS/eip-7594&quot;&gt;EIP-7594&lt;/a&gt;) by
allowing more efficient transfers of blob data columns across the network.
Instead of having to exchange full data columns, peers exchange only the cells
they need within a column. This becomes especially useful when the majority of
cells within a column are already present from the local mempool. This
optimization is backwards compatible and can be progressively deployed. It does
not require a hard fork. Nodes that do not implement this optimization still
receive and transmit full data columns.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;In the vast majority of cases, all or nearly all blobs referenced in a block are
available in the mempool. Leveraging the blob data a node already has locally
lets a node avoid wasting bandwidth for cells it already has. In the current
design, if even a single blob is not present in the local mempool, the Consensus
Layer will have to wait to receive the full data column from the network before
passing its data availability checks. With this optimization, the client need
only wait to receive the missing cells.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc2119&quot;&gt;RFC 2119&lt;/a&gt; and &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8174&quot;&gt;RFC 8174&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cell-Level Deltas uses Gossipsub’s Partial Messages Extension to
exchange cell bitmaps and request/provide cells.&lt;/p&gt;

&lt;p&gt;In an effort to maintain a single source of truth, the specification is defined
in the &lt;a href=&quot;https://github.com/ethereum/consensus-specs/tree/b3b06d939c3f7301d218bca7adc39eed5806d553/./&quot;&gt;ethereum/consensus-specs&lt;/a&gt; repo.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;The design is guided by two main factors:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Minimal semantic changes.&lt;/li&gt;
  &lt;li&gt;Backwards compatible (no hard fork required).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These two factors lead the design into something that extends the existing
gossipsub behavior rather than introducing a new protocol. The mesh and gossip
properties of gossipsub are unchanged. If a node’s gossipsub peers support this
extension they can both make use of it. Otherwise, the behavior falls back to
traditional gossipsub.&lt;/p&gt;

&lt;p&gt;The biggest difference the extension introduces is defaulting to a pull-based
dissemination strategy of cells rather than a push based one. Eager pushing of
data is still possible, but it is not the default behavior.&lt;/p&gt;

&lt;h3 id=&quot;alternative-designs&quot;&gt;Alternative Designs&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Smaller gossipsub messages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This design makes the gossipsub message unit be a single cell rather than a full
column. While it would transfer data at the cell level, without having bitmaps
as a first class concept it would introduce overhead for a cell per message.
Furthermore, informing peers about cells a node has (via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IDONTWANT&lt;/code&gt;) would always
race against the peers pushing the same cells to the node. The default-push
strategy is too aggressive for the case when almost all blobs are public. The
message ID is content based (e.g. a hash), and lacks context as to what block
this cell is part of, making it impossible for a node to request cells it
doesn’t have or prioritize cells from a block it’s processing.&lt;/p&gt;

&lt;p&gt;Changing the semantics of the message ID may be possible as a workaround for
some of the above issues, but this would still require a separate gossipsub
topic that could not be used as a backwards compatible replacement to the
existing gossipsub topic. Changing message ID semantics may also break gossipsub
implementations that assume a message ID and message are 1:1.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A new RPC method.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This seems like the simplest option at first glance, but it ignores the work
already happening in gossipsub. If we merely add a new RPC method with no
gossipsub changes, we risk only increasing network and compute load rather than
reducing it. Because we are now doing an extra RPC on top of existing gossipsub
work. To fix this, gossipsub and the RPC method need to be cognizant of each
other. Eventually this leads to the proposed design, a gossipsub extension of
partial messages with application defined semantics.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A new protocol separate from gossipsub.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While this may be a long term direction worth exploring, this is deemed too big
a change to make to leverage this optimization. Especially if we’d like to
deploy this without a hard fork.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;No backward compatibility issues.&lt;/p&gt;

&lt;p&gt;Nodes form gossipsub meshes and gossip with the same rules as before. This
optimization only takes effect when both nodes in a gossipsub exchange support
this extension. If either side does not support this extension, both nodes
behave the same as before, exchanging full gossipsub messages to each other.&lt;/p&gt;

&lt;p&gt;Gossipsub scores peers well if they provide timely messages, and penalizes peers
if they provide invalid messages. This extension does not change that, peer
scores should behave the same with and without this extension.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;In the default case, this adds minor latency to cell dissemination compared to
the standard gossipsub’s default push behavior in exchange for more efficient
bandwidth usage. However, over time the eager cell push policy of nodes can be
refined to match and even improve dissemination latency. This latency is a key
metric that will be monitored during and after rollout.&lt;/p&gt;

&lt;p&gt;There are also a couple implementation specific pitfalls client implementers and
gossipsub implementers should be aware of.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;While it is more efficient for a node to mesh with peers that support this
EIP, it risks dividing the network if those peers are preferred.
Implementations SHOULD NOT discriminate against peers that do not support
this extension.&lt;/li&gt;
  &lt;li&gt;Related to the above, a peer’s score should be roughly equivalent whether
they support partial messages or not. A peer should not score higher if they
provide cells one at a time versus all at once.&lt;/li&gt;
  &lt;li&gt;Implementations should be resilient to peers spamming messages with
different Group IDs. Implementations SHOULD reserve space for mesh peer
messages in case of adversarial non-mesh peers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This optimization is expected to roll out gradually with the ability to roll
back if needed.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Thu, 23 Jan 2025 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8136</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8136</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
      
      
      <item>
        <title>eth/71 - Block Access List Exchange</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8159 - eth/71 - Block Access List Exchange&lt;/strong&gt; is in Last Call status. It is authored by Toni Wahrstätter (@nerolation) and was originally created 2026-02-12. It is in the Networking category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8159-eth-71-block-access-list-exchange/27725&quot;&gt;https://ethereum-magicians.org/t/eip-8159-eth-71-block-access-list-exchange/27725&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP modifies the ‘eth’ p2p protocol to support Block-level Access Lists (BALs). It adds two new messages, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetBlockAccessLists&lt;/code&gt; (0x12) and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockAccessLists&lt;/code&gt; (0x13), enabling peers to request and serve BALs for synchronization and parallel execution.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; introduces block-level access lists that record all state locations accessed during block execution. These lists enable parallel disk reads, parallel transaction execution, and executionless state updates.&lt;/p&gt;

&lt;p&gt;For syncing clients to leverage these capabilities, BALs must be obtainable from peers. The Engine API provides BALs from the consensus layer during normal operation, but historical BALs and peer-based sync require wire protocol support.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;block-header-extension&quot;&gt;Block Header Extension&lt;/h3&gt;

&lt;p&gt;The block header is extended with a new field after &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requests-hash&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;block-header = [
    ...
    requests-hash: B_32,
    block-access-list-hash: B_32,
]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-access-list-hash&lt;/code&gt; field contains &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keccak256(rlp.encode(block-access-list))&lt;/code&gt; as defined in &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;. This field MUST be present in headers after the Amsterdam fork and absent for earlier blocks.&lt;/p&gt;

&lt;h3 id=&quot;block-access-list-encoding&quot;&gt;Block Access List Encoding&lt;/h3&gt;

&lt;p&gt;BALs are RLP-encoded as a list of account changes, sorted lexicographically by address:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;block-access-list = [account-changes₁, account-changes₂, ...]

account-changes = [
    address: B_20,
    storage-changes,
    storage-reads,
    balance-changes,
    nonce-changes,
    code-changes,
]

storage-changes = [slot-changes₁, slot-changes₂, ...]
slot-changes = [slot: P, [storage-change₁, storage-change₂, ...]]
storage-change = [block-access-index: P, value: P]

storage-reads = [slot₁: P, slot₂: P, ...]

balance-changes = [balance-change₁, balance-change₂, ...]
balance-change = [block-access-index: P, balance: P]

nonce-changes = [nonce-change₁, nonce-change₂, ...]
nonce-change = [block-access-index: P, nonce: P]

code-changes = [code-change₁, code-change₂, ...]
code-change = [block-access-index: P, code: B]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage-changes&lt;/code&gt; MUST be sorted by slot ascending. Changes within each slot MUST be sorted by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-access-index&lt;/code&gt; ascending. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;storage-reads&lt;/code&gt; MUST be sorted by slot ascending.&lt;/p&gt;

&lt;p&gt;Where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-access-index&lt;/code&gt; indicates when the change occurred:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; for pre-execution system contract calls&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1...n&lt;/code&gt; for transactions (in block order)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n+1&lt;/code&gt; for post-execution system contract calls and withdrawals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; for complete BAL generation rules and inclusion semantics.&lt;/p&gt;

&lt;h3 id=&quot;new-protocol-messages&quot;&gt;New Protocol Messages&lt;/h3&gt;

&lt;h4 id=&quot;getblockaccesslists-0x12&quot;&gt;GetBlockAccessLists (0x12)&lt;/h4&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[request-id: P, [blockhash₁: B_32, blockhash₂: B_32, ...]]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Request BALs for the given block hashes. The number of BALs that can be requested in a single message is subject to implementation-defined limits.&lt;/p&gt;

&lt;p&gt;BALs are only available for blocks after &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; activation and within the retention period defined therein. Requests for unavailable BALs return empty entries.&lt;/p&gt;

&lt;h4 id=&quot;blockaccesslists-0x13&quot;&gt;BlockAccessLists (0x13)&lt;/h4&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[request-id: P, [block-access-list₁, block-access-list₂, ...]]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Response to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetBlockAccessLists&lt;/code&gt;. Each element corresponds to a block hash from the request, in order. The RLP empty string (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x80&lt;/code&gt;) is returned for blocks where the BAL is unavailable.&lt;/p&gt;

&lt;p&gt;The recommended soft limit for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockAccessLists&lt;/code&gt; responses is 2 MiB.&lt;/p&gt;

&lt;h3 id=&quot;validation&quot;&gt;Validation&lt;/h3&gt;

&lt;p&gt;When a BAL is received, clients MUST validate it by computing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keccak256(rlp.encode(bal))&lt;/code&gt; and comparing against the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-access-list-hash&lt;/code&gt; in the corresponding block header.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;separate-messages-vs-block-body-extension&quot;&gt;Separate Messages vs. Block Body Extension&lt;/h3&gt;

&lt;p&gt;BALs are transmitted via dedicated messages rather than extending block bodies because:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Size&lt;/strong&gt;: BALs average ~70 KiB, significantly increasing block propagation overhead if bundled.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Optional retrieval&lt;/strong&gt;: Not all sync strategies require BALs. Snap sync can reconstruct state without them.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Retention policy&lt;/strong&gt;: BALs may be pruned per &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;, while block bodies are retained longer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;message-ids&quot;&gt;Message IDs&lt;/h3&gt;

&lt;p&gt;Message IDs 0x12 and 0x13 follow sequentially from the existing eth/69 messages (BlockRangeUpdate is 0x11).&lt;/p&gt;

&lt;h3 id=&quot;response-size-limit&quot;&gt;Response Size Limit&lt;/h3&gt;

&lt;p&gt;The 2 MiB soft limit is consistent with other eth protocol responses (blocks, receipts, headers) and accommodates multiple BALs per response. Responses containing a single BAL that exceeds 2 MiB are still valid, as the soft limit governs when to stop appending additional items, not the maximum size of an individual item.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP changes the eth protocol and requires rolling out a new version, eth/71. Supporting multiple protocol versions is standard practice. Rolling out eth/71 does not break older clients, as they can continue using eth/69 or eth/70.&lt;/p&gt;

&lt;p&gt;This EIP requires the Amsterdam hard fork for the header field extension. The new messages are only meaningful for post-Amsterdam blocks.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;h3 id=&quot;validation-cost&quot;&gt;Validation Cost&lt;/h3&gt;

&lt;p&gt;BAL validation requires computing a keccak256 hash of the RLP-encoded list. For typical BALs (~70 KiB), this is negligible. For worst-case BALs at high gas limits, validation remains bounded by the block gas limit.&lt;/p&gt;

&lt;h3 id=&quot;amplification&quot;&gt;Amplification&lt;/h3&gt;

&lt;p&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetBlockAccessLists&lt;/code&gt; request can trigger responses larger than the request. Implementations SHOULD apply rate limiting and respect the soft response size limit to prevent amplification attacks.&lt;/p&gt;

&lt;h3 id=&quot;unavailable-data&quot;&gt;Unavailable Data&lt;/h3&gt;

&lt;p&gt;Clients MUST handle empty responses gracefully. A peer returning empty entries for available blocks may be misbehaving but could also have pruned the data legitimately.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8159</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8159</guid>
      </item>
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
      <item>
        <title>snap/2 - BAL-Based State Healing</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8189 - snap/2 - BAL-Based State Healing&lt;/strong&gt; is in Last Call status. It is authored by Toni Wahrstätter (@nerolation), Gary Rong (@rjl493456442) and was originally created 2026-03-06. It is in the Networking category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8189-snap-2-bal-based-state-healing/27953&quot;&gt;https://ethereum-magicians.org/t/eip-8189-snap-2-bal-based-state-healing/27953&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP upgrades the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snap&lt;/code&gt; protocol from version 1 to version 2, removing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetTrieNodes&lt;/code&gt; (0x06) / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TrieNodes&lt;/code&gt; (0x07) and adding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetBlockAccessLists&lt;/code&gt; (0x08) / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockAccessLists&lt;/code&gt; (0x09) to enable BAL-based state healing during snap sync.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; introduces block-level access lists (BALs) that capture all state changes per block, committed to block headers via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-access-list-hash&lt;/code&gt;. With BALs available, the snap sync healing phase — which iteratively fetches individual Merkle trie nodes via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetTrieNodes&lt;/code&gt; to resolve state inconsistencies — can be replaced entirely.&lt;/p&gt;

&lt;p&gt;Instead of discovering and fetching trie nodes across many round trips, a syncing node downloads BALs for the blocks that advanced during sync and applies state diffs sequentially. Each BAL is verified against its header commitment. The set of blocks to catch up is known upfront, eliminating iterative discovery.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;h3 id=&quot;protocol-version&quot;&gt;Protocol Version&lt;/h3&gt;

&lt;p&gt;The protocol version is incremented from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snap/1&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snap/2&lt;/code&gt;. Peers negotiate the version during the RLPx capability handshake.&lt;/p&gt;

&lt;h3 id=&quot;removed-messages&quot;&gt;Removed Messages&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Message&lt;/th&gt;
      &lt;th&gt;ID&lt;/th&gt;
      &lt;th&gt;Reason&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetTrieNodes&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;0x06&lt;/td&gt;
      &lt;td&gt;Replaced by BAL-based healing&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TrieNodes&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;0x07&lt;/td&gt;
      &lt;td&gt;Replaced by BAL-based healing&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;new-messages&quot;&gt;New Messages&lt;/h3&gt;

&lt;h4 id=&quot;getblockaccesslists-0x08&quot;&gt;GetBlockAccessLists (0x08)&lt;/h4&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[request-id: P, [blockhash₁: B_32, blockhash₂: B_32, ...], bytes: P]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Request BALs for the given block hashes. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bytes&lt;/code&gt; is the maximum cumulative size of the BAL data the client is willing to receive in a single response. The number of hashes per request is subject to implementation-defined limits.&lt;/p&gt;

&lt;p&gt;BALs are only available for blocks after &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; activation and within the retention period defined therein.&lt;/p&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Nodes &lt;strong&gt;must&lt;/strong&gt; always respond to the query.&lt;/li&gt;
  &lt;li&gt;If the node does not have the BAL for a requested block hash, it &lt;strong&gt;must&lt;/strong&gt; return the RLP empty string (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x80&lt;/code&gt;) at that position.&lt;/li&gt;
  &lt;li&gt;The responding node is allowed to return &lt;strong&gt;fewer&lt;/strong&gt; entries than requested (serving the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bytes&lt;/code&gt; soft limit or Quality of Service (QoS) limits), truncating from the tail. Returned entries &lt;strong&gt;must&lt;/strong&gt; preserve request order.&lt;/li&gt;
  &lt;li&gt;Nodes &lt;strong&gt;should&lt;/strong&gt; retain BALs for orphaned (non-canonical) blocks within the retention period defined in &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;. Since requests are keyed by block hash, orphaned BALs can be served the same way as canonical ones. Retaining them enables syncing nodes to recover from reorgs past the pivot block without restarting sync.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;blockaccesslists-0x09&quot;&gt;BlockAccessLists (0x09)&lt;/h4&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[request-id: P, [block-access-list₁, block-access-list₂, ...]]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Response to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetBlockAccessLists&lt;/code&gt;. Each element corresponds positionally to a block hash from the request. The RLP empty string (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x80&lt;/code&gt;) is returned for blocks where the BAL is unavailable.&lt;/p&gt;

&lt;p&gt;The responding node &lt;strong&gt;should&lt;/strong&gt; respect the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bytes&lt;/code&gt; limit from the request. In the absence of a specific limit, the recommended soft limit for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BlockAccessLists&lt;/code&gt; responses is 2 MiB.&lt;/p&gt;

&lt;h3 id=&quot;unchanged-messages&quot;&gt;Unchanged Messages&lt;/h3&gt;

&lt;p&gt;Messages 0x00–0x05 (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetAccountRange&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AccountRange&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetStorageRanges&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StorageRanges&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetByteCodes&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ByteCodes&lt;/code&gt;) are unchanged from snap/1.&lt;/p&gt;

&lt;h3 id=&quot;validation&quot;&gt;Validation&lt;/h3&gt;

&lt;p&gt;Received BALs &lt;strong&gt;must&lt;/strong&gt; be validated by computing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keccak256(rlp.encode(bal))&lt;/code&gt; and comparing against the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-access-list-hash&lt;/code&gt; in the corresponding block header. See &lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt; for the BAL encoding format.&lt;/p&gt;

&lt;h3 id=&quot;synchronization-algorithm&quot;&gt;Synchronization Algorithm&lt;/h3&gt;

&lt;p&gt;snap/2 replaces trie healing with BAL-based catch-up:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Download headers and identify the chain head.&lt;/li&gt;
  &lt;li&gt;Pick a pivot block P sufficiently behind the chain head (e.g., HEAD-64) to reduce the likelihood of P being reorged while remaining recent enough that serving peers still hold its state in memory.&lt;/li&gt;
  &lt;li&gt;Bulk download state at P via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetAccountRange&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetStorageRanges&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetByteCodes&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;If P becomes stale during bulk download (step 3) — i.e., serving peers no longer hold state at P — the syncing node fetches BALs for blocks P+1 through P’ via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetBlockAccessLists&lt;/code&gt; (where P’ is the new pivot), applies the diffs locally, and continues bulk download at P’.&lt;/li&gt;
  &lt;li&gt;While state is being downloaded, the chain advances and the pivot switches from P to a new block P+K (typically K is 64). Because serving peers may no longer retain the state at P once the pivot advances, the syncing node fetches BALs for blocks P+1 through P+K via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetBlockAccessLists&lt;/code&gt;, applies the state diffs locally, and immediately uses P+K as the new sync target. Each BAL is verified against its header hash before application.&lt;/li&gt;
  &lt;li&gt;If the pivot advances further during step 5, repeat for the newly produced blocks.&lt;/li&gt;
  &lt;li&gt;Recompute and verify the state root against the latest header.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the chain reorgs past the pivot block P, let W be the common ancestor of the old and new canonical chains. The syncing node collects BALs for blocks W+1 through P on the old fork, identifies state entries mutated on the old fork but not on the new fork, deletes those entries locally, and re-fetches them via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetAccountRange&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetStorageRanges&lt;/code&gt;. It then applies BALs from W+1 forward on the new canonical chain and continues sync with a new pivot. If the required orphaned BALs are unavailable, the node must discard state and restart sync.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;separate-protocol-vs-eth71&quot;&gt;Separate Protocol vs. eth/71&lt;/h3&gt;

&lt;p&gt;This follows the established snap design philosophy. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetByteCodes&lt;/code&gt; was duplicated from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth&lt;/code&gt; into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snap&lt;/code&gt; for the same reason:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;This functionality was duplicated into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snap&lt;/code&gt; from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth/65&lt;/code&gt; to permit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth&lt;/code&gt; long term to become a chain maintenance protocol only and move synchronization primitives out into satellite protocols only.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Synchronization primitives belong in satellite protocols. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snap&lt;/code&gt; is optional and independently versioned; duplicating BAL exchange here avoids coupling sync functionality to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;removing-gettrienodes&quot;&gt;Removing GetTrieNodes&lt;/h3&gt;

&lt;p&gt;BAL-based healing makes trie node fetching for state reconciliation unnecessary. Removing these messages avoids maintaining two healing mechanisms.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP requires rolling out a new protocol version, snap/2. Older clients continue using snap/1. snap/2 is only meaningful for post-Amsterdam blocks, since the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-access-list-hash&lt;/code&gt; header field (&lt;a href=&quot;/EIPS/eip-7928&quot;&gt;EIP-7928&lt;/a&gt;) is absent for earlier blocks.&lt;/p&gt;

&lt;p&gt;For a node synchronizing data, if both snap/1 and snap/2 are supported, it should use either snap/1 or snap/2 for state sync; running both simultaneously is not recommended. Once the synchronization phase is complete, the node can serve requests for both protocols.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;h3 id=&quot;amplification&quot;&gt;Amplification&lt;/h3&gt;

&lt;p&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GetBlockAccessLists&lt;/code&gt; request can trigger responses significantly larger than the request. Implementations &lt;strong&gt;should&lt;/strong&gt; apply rate limiting and respect the 2 MiB soft response limit.&lt;/p&gt;

&lt;h3 id=&quot;unavailable-data&quot;&gt;Unavailable Data&lt;/h3&gt;

&lt;p&gt;Peers returning empty entries for available blocks may be misbehaving or may have pruned data legitimately. Implementations should track peer reliability and deprioritize unreliable peers.&lt;/p&gt;

&lt;h3 id=&quot;application-order&quot;&gt;Application Order&lt;/h3&gt;

&lt;p&gt;BALs &lt;strong&gt;must&lt;/strong&gt; be applied in strict block order with each BAL hash verified before application. Incorrect ordering or wrong-fork BALs produce an invalid state root, detected during the final state root verification.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8189</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8189</guid>
      </item>
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
      <item>
        <title>Remove SELFDESTRUCT Burn</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8246 - Remove SELFDESTRUCT Burn&lt;/strong&gt; is in Last Call status. It is authored by Paweł Bylica (@chfast) and was originally created 2026-05-01. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8246-remove-selfdestruct-burn/28416&quot;&gt;https://ethereum-magicians.org/t/eip-8246-remove-selfdestruct-burn/28416&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP removes the remaining cases where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; burns ETH. Accounts marked for selfdestruction still have their code, storage, and nonce cleared at transaction finalization, but any remaining balance is preserved.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;The remaining burn behavior of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; is almost completely unused, but it still forces special-case handling in EVM implementations, specifications, and tests.&lt;/p&gt;

&lt;p&gt;After &lt;a href=&quot;/EIPS/eip-6780&quot;&gt;EIP-6780&lt;/a&gt;, ETH can still be burned only when a contract created in the same transaction executes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;, either with itself as beneficiary or in a case where the contract receives additional ETH (via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CALL&lt;/code&gt; or via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;, potentially multiple times) later in the same transaction.
A full replay of Ethereum mainnet from genesis to approximately block 25M found only 2 post-Cancun burns through this path and 0 cases of balance being burned during transaction finalization. By comparison, pre-Cancun history contained 54 self-burns in total. This indicates that the remaining burn behavior is rarer than the burn behavior already removed by EIP-6780, so the complete removal proposed here should affect fewer transactions than the partial removal already introduced there.&lt;/p&gt;

&lt;p&gt;Removing the final burn cases simplifies &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; semantics and avoids preserving an exotic special case that is barely used in practice.&lt;/p&gt;

&lt;p&gt;As a consequence, this also removes the last EVM mechanism by which ETH can leave total supply.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The behavior of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; changes as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;When &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; is executed in the same transaction as the contract was created,
and if the beneficiary address is the executing account address,
the balance of this account remains unchanged.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;During transaction finalization,
all accounts marked for selfdestruction,
instead of being deleted,
are modified as follows:&lt;/p&gt;

    &lt;ol&gt;
      &lt;li&gt;nonce is reset to 0,&lt;/li&gt;
      &lt;li&gt;balance is unchanged,&lt;/li&gt;
      &lt;li&gt;code is cleared,&lt;/li&gt;
      &lt;li&gt;all storage is cleared.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note: All other behavior of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; is unchanged.&lt;/p&gt;

&lt;p&gt;Note: If the resulting balance is 0, the account is &lt;em&gt;empty&lt;/em&gt; and is deleted from the state by &lt;a href=&quot;/EIPS/eip-161&quot;&gt;EIP-161&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;p&gt;This change removes burn behavior at its source instead of adding dedicated handling for it elsewhere.&lt;/p&gt;

&lt;p&gt;The chosen design preserves the state-clearing effect of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; for contracts created in the same transaction. The account may still survive in the state, but only as a balance-only account. This removes the special case where ETH disappears from the state while keeping the account non-executable after transaction finalization.&lt;/p&gt;

&lt;p&gt;Resetting the nonce to 0 ensures that a future &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; at the same address is not blocked by a preserved balance-only account.&lt;/p&gt;

&lt;p&gt;An alternative would be to preserve the whole account, including nonce, code, and storage. That would work as a complete &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; disarming and would remove the burn as well, but it would be a larger semantic change than necessary. This EIP removes only the burn behavior.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP requires a hard fork, since it modifies consensus rules.&lt;/p&gt;

&lt;p&gt;Previously it was possible to burn ETH by executing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; in a contract created in the same transaction, either by targeting the executing contract as beneficiary or by sending ETH to the contract after &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; and before transaction finalization. After this EIP, ETH will not be burned in either case.&lt;/p&gt;

&lt;p&gt;Previously such contracts were always deleted at transaction finalization. After this EIP, a contract with zero final balance is still deleted, but a contract with nonzero final balance remains in the state as a balance-only account with empty code, empty storage, and nonce 0.&lt;/p&gt;

&lt;p&gt;For the balance-only accounts created this way, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; still may recreate a contract at the same address in a follow-up transaction. Such a usage pattern remains operational.&lt;/p&gt;

&lt;p&gt;For contracts not created in the same transaction in which &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; is executed, the behavior is unchanged from &lt;a href=&quot;/EIPS/eip-6780&quot;&gt;EIP-6780&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unlike Mainnet, some L2 chains use the burn feature of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; regularly and will require a separate migration plan.&lt;/p&gt;

&lt;p&gt;In the OP Stack, ETH withdrawn to L1 accumulates in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;L2ToL1MessagePasser&lt;/code&gt; predeploy at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x4200000000000000000000000000000000000016&lt;/code&gt;. It provides a permissionless &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;burn()&lt;/code&gt; function which destroys that balance by creating a contract whose constructor executes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; with itself as the beneficiary, so the L2 ETH supply does not inflate. Chains derived from that codebase inherit the dependency unless they modify the predeploy, including those not commonly identified as Optimism-based. Such contracts are deployed with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE&lt;/code&gt;, so the balance-only accounts they leave behind cannot be recreated by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; pattern described above.&lt;/p&gt;

&lt;h2 id=&quot;test-cases&quot;&gt;Test Cases&lt;/h2&gt;

&lt;h3 id=&quot;unmodified-behavior&quot;&gt;Unmodified behavior&lt;/h3&gt;

&lt;p&gt;General test coverage of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; instruction is expected to be excellent already because this instruction has been modified multiple times in the past. Updating existing test cases to align with this EIP should give us good coverage of all &lt;strong&gt;unmodified&lt;/strong&gt; features of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;modified-behavior&quot;&gt;Modified behavior&lt;/h3&gt;

&lt;p&gt;Each of the following test cases should be executed (where physically meaningful) across the combinations of these factors:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;level: top-level transaction, internal call,&lt;/li&gt;
  &lt;li&gt;call type: CALL (including top-level tx), CREATE (including top-level tx), CREATE2,&lt;/li&gt;
  &lt;li&gt;code state: SELFDESTRUCT executed inside initcode (before deployment) / from deployed code,&lt;/li&gt;
  &lt;li&gt;status: SELFDESTRUCT succeeds, SELFDESTRUCT fails due to OOG,&lt;/li&gt;
  &lt;li&gt;revert: effects of SELFDESTRUCT are committed to the post-state, effects of SELFDESTRUCT are reverted (only for wrapped internal calls),&lt;/li&gt;
  &lt;li&gt;balance: balance of the selfdestructing account at the SELFDESTRUCT instruction is zero / non-zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;instruction-level&quot;&gt;Instruction level&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-self.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-self, followed by selfdestruct-to-self.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-self, followed by selfdestruct-to-other.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-other, followed by selfdestruct-to-self.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;transaction-finalization&quot;&gt;Transaction finalization&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-other, followed by a CALL with value to the selfdestructed account.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-other, followed by multiple CALLs with value to the selfdestructed account.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-other, followed by a CALL with value to the selfdestructed account, followed by selfdestruct-to-other.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-other, followed by a CALL with value to the selfdestructed account, followed by selfdestruct-to-self.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-self, followed by a CALL with value to the selfdestructed account.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-self, followed by multiple CALLs with value to the selfdestructed account.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-self, followed by a CALL with value to the selfdestructed account, followed by selfdestruct-to-other.&lt;/li&gt;
  &lt;li&gt;Same-transaction selfdestruct-to-self, followed by a CALL with value to the selfdestructed account, followed by selfdestruct-to-self.&lt;/li&gt;
  &lt;li&gt;Create new account, new account creates other accounts to bump its nonce, new account selfdestruct-to-self.&lt;/li&gt;
  &lt;li&gt;Create new account, new account creates other accounts to bump its nonce, new account selfdestruct-to-other.&lt;/li&gt;
  &lt;li&gt;Create new account, new account adds new storage, new account selfdestruct-to-self.&lt;/li&gt;
  &lt;li&gt;Create new account, new account adds new storage, new account selfdestruct-to-other.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;multi-transaction&quot;&gt;Multi-transaction&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;Tx-1: CREATE2 new account with non-zero balance, new account selfdestruct-to-self. Tx-2: Repeats Tx-1.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELFDESTRUCT&lt;/code&gt; behavior modification has a combinatorial effect on a vast number of test scenarios involving multi-call/create contract interactions. This EIP requires significant testing effort. However, many existing test cases for EIP-6780 can be adapted to the new behavior.&lt;/li&gt;
  &lt;li&gt;When a use case relies on the ETH burn happening, the transaction will create dust-like accounts with potentially locked non-zero balance. However, the new account creation gas cost is paid by the transaction, so dust accounts are not a free DoS vector. Only 2 such events have been recorded on Mainnet (Cancun–25M) so far.&lt;/li&gt;
  &lt;li&gt;Preserving the balance leaves a funded account whose nonce, code and storage are cleared, which makes the address a valid &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; target again (a non-zero balance alone never triggers a creation collision, per &lt;a href=&quot;/EIPS/eip-684&quot;&gt;EIP-684&lt;/a&gt;). The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(sender, salt, initcode)&lt;/code&gt; of a deployment is public data, so when the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sender&lt;/code&gt; is a permissionless factory anyone can redeploy the account and potentially take the preserved balance.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8246</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8246</guid>
      </item>
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
      
      
      <item>
        <title>Gas Limit Schedule</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8261 - Gas Limit Schedule&lt;/strong&gt; is in Last Call status. It is authored by Barnabas Busa (@barnabasbusa) and was originally created 2026-05-11. It is in the  category of type Informational. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8261-gas-limit-schedule/28494&quot;&gt;https://ethereum-magicians.org/t/eip-8261-gas-limit-schedule/28494&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP recommends that, starting with Gloas (&lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt;), consensus layer clients source their gas limit preference from an optional &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_LIMIT_SCHEDULE&lt;/code&gt; field in the consensus layer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.yaml&lt;/code&gt; instead of hardcoded, release-scoped defaults. Each entry activates at the start of its specified epoch and provides a value that plays two roles: it is the &lt;strong&gt;default&lt;/strong&gt; gas limit that validator clients target in the absence of operator configuration, and the &lt;strong&gt;recommended maximum&lt;/strong&gt;. The schedule is ignored before Gloas, preserving existing gas limit behavior. Operators remain free to configure any value; clients should warn when a configured preference exceeds the active scheduled value, but honor it because the maximum is a recommendation, not a rule. The schedule lives only on the consensus layer because post-Gloas the validator’s preference flows through validator registrations and the builder pipeline, with no execution layer configuration involved. No consensus rules are changed: the &lt;a href=&quot;/EIPS/eip-1559&quot;&gt;EIP-1559&lt;/a&gt; ±1/1024 elasticity rule remains the only gas-limit validity rule, and blocks above or below the scheduled value remain valid.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;Today the block gas limit is set by each block proposer, driven by validator client “preferred gas limit” settings, client default configurations, and builder bids, with the ±1/1024 elasticity rule from &lt;a href=&quot;/EIPS/eip-1559&quot;&gt;EIP-1559&lt;/a&gt; moving the realized limit block by block.&lt;/p&gt;

&lt;p&gt;The pain point this EIP addresses is that gas limit defaults are &lt;strong&gt;release-scoped&lt;/strong&gt; rather than &lt;strong&gt;epoch-based&lt;/strong&gt;: a new default activates whenever an operator happens to update their node, not at a network-coordinated epoch. This creates a concrete coordination problem for large increases. Suppose clients want to raise the default from 60M toward a substantially higher value at a future epoch:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If clients ship the new default in releases ahead of the activation epoch, every node updated early starts voting the gas limit up &lt;em&gt;immediately&lt;/em&gt;, before the network has agreed the new value is safe to reach.&lt;/li&gt;
  &lt;li&gt;The alternative, shipping the new default in a back-to-back release immediately after the intended activation epoch and asking all operators to update quickly, is operationally inconvenient and slow to take effect.&lt;/li&gt;
  &lt;li&gt;One-off override flags for each planned increase push the coordination burden onto every individual operator.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also no single place where “the gas limit the network should run at” is written down: moving the network today requires either every client team shipping a new hardcoded default, or a large share of operators updating flags, coordinated socially over months. &lt;a href=&quot;/EIPS/eip-7935&quot;&gt;EIP-7935&lt;/a&gt; demonstrated that coordinating a default gas limit recommendation at a known epoch works; this EIP generalizes that approach into a reusable, machine-readable schedule, mirroring the epoch-based &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BLOB_SCHEDULE&lt;/code&gt; configuration format from &lt;a href=&quot;/EIPS/eip-7892&quot;&gt;EIP-7892&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With Gloas (&lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt;), the consensus layer becomes the natural single home for this schedule: the gas limit a block is built to originates from the validator side of the builder flow, so a CL configuration entry can drive the network’s gas limit end to end without any execution layer configuration.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc2119&quot;&gt;RFC 2119&lt;/a&gt; and &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8174&quot;&gt;RFC 8174&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This EIP changes no consensus rules. The &lt;a href=&quot;/EIPS/eip-1559&quot;&gt;EIP-1559&lt;/a&gt; gas limit validity rules (±1/1024 elasticity, 5000 minimum) are unchanged, and a block whose &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_limit&lt;/code&gt; differs from the scheduled value in either direction remains valid. Everything below is recommended client and tooling behavior.&lt;/p&gt;

&lt;h3 id=&quot;gas-limit-schedule&quot;&gt;Gas limit schedule&lt;/h3&gt;

&lt;p&gt;The consensus layer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.yaml&lt;/code&gt; MAY be extended with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_LIMIT_SCHEDULE&lt;/code&gt; field, mirroring the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BLOB_SCHEDULE&lt;/code&gt; mechanism in &lt;a href=&quot;/EIPS/eip-7892&quot;&gt;EIP-7892&lt;/a&gt;. Entries represent recommended gas limit changes that take effect at the start of the listed epoch:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;GAS_LIMIT_SCHEDULE&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;EPOCH&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;500000&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;# Gloas activation epoch&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;GAS_LIMIT&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;60000000&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;EPOCH&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;520000&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;# A later scheduled increase&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;GAS_LIMIT&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;75000000&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;EPOCH&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;540000&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;# Another scheduled increase&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;GAS_LIMIT&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;90000000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EPOCH&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_LIMIT&lt;/code&gt; are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64&lt;/code&gt; values; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_LIMIT&lt;/code&gt; matches the type of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionPayload.gas_limit&lt;/code&gt; in the consensus specifications.&lt;/p&gt;

&lt;p&gt;The field is OPTIONAL: CL clients MAY add support for it, and clients that do not recognize it ignore it, per the existing convention for unknown configuration keys. Supporting clients MUST ignore the schedule for duties before &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GLOAS_FORK_EPOCH&lt;/code&gt;. A client that is not using the parameter because the duty is pre-Gloas, the field is absent, or no schedule entry is active simply keeps its existing gas limit behavior.&lt;/p&gt;

&lt;p&gt;Each entry independently schedules a recommended gas limit change at its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EPOCH&lt;/code&gt;. An entry MAY align with a protocol upgrade, but the schedule itself does not create or require a fork.&lt;/p&gt;

&lt;p&gt;Define:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_scheduled_gas_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Optional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GLOAS_FORK_EPOCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;active_entries&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GAS_LIMIT_SCHEDULE&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EPOCH&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;active_entries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Latest schedule entry whose EPOCH &amp;lt;= epoch
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;active_entries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EPOCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GAS_LIMIT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;recommended-client-behavior&quot;&gt;Recommended client behavior&lt;/h3&gt;

&lt;p&gt;For CL clients that support &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GAS_LIMIT_SCHEDULE&lt;/code&gt;, an active scheduled value serves as both the default gas limit and the recommended maximum:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Default.&lt;/strong&gt; When no operator preference is supplied and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_scheduled_gas_limit(epoch)&lt;/code&gt; returns a value, the client SHOULD use it as the gas limit preference, where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;epoch&lt;/code&gt; is the epoch of the slot the registration or proposal applies to. Before Gloas or when no entry is active, the client SHOULD retain its existing default behavior. Clients SHOULD NOT introduce a separate release-scoped default for epochs covered by an active schedule entry.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Recommended maximum.&lt;/strong&gt; If an operator-supplied preference exceeds the active scheduled value, the client SHOULD honor it, since this EIP introduces no enforcement, but SHOULD log a clear warning, e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;configured gas limit 100000000 exceeds the recommended maximum of 90000000 at epoch 540000&lt;/code&gt;. Exceeding the recommendation is thereby a deliberate, visible operator decision rather than a silent one.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Operator preferences are always honored.&lt;/strong&gt; Values below the scheduled value work unchanged, as today.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Builders and relays.&lt;/strong&gt; When a schedule entry is active, builders SHOULD produce, and relays SHOULD prefer, bids whose &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gas_limit&lt;/code&gt; does not exceed the scheduled value for the bid’s slot.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;epoch-based-switching&quot;&gt;Epoch-based switching&lt;/h4&gt;

&lt;p&gt;The schedule only delivers its benefit if the effective default changes exactly at the configured epoch boundary, which requires new client logic: today, gas limit defaults are read once (at startup, or when a validator registration is created) and held constant. Under this EIP, the scheduled value SHOULD be looked up per duty against the epoch of the slot being proposed or registered for, never against wall-clock time or a value cached at startup. A running node then switches its preference at the first slot of the configured epoch with no restart, follow-up release, or operator action. Since validator registrations are re-issued periodically, registrations naturally roll over to a new scheduled value as duties cross the activation epoch.&lt;/p&gt;

&lt;p&gt;Because the schedule is keyed by epoch, a release shipped months before an entry activates keeps using the current value until that epoch, then switches automatically. This makes it safe to ship large future increases well ahead of time: early updaters do not begin voting toward the new value before its configured activation epoch.&lt;/p&gt;

&lt;h4 id=&quot;the-consensus-layer-drives-the-gas-limit&quot;&gt;The consensus layer drives the gas limit&lt;/h4&gt;

&lt;p&gt;Starting with Gloas (&lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt;), the gas limit a block is built to originates on the consensus layer side of the builder flow — the validator’s preference, expressed through validator registrations and the payload bid path — rather than from execution layer configuration. The schedule therefore lives only in the CL &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.yaml&lt;/code&gt;; no execution layer chain-configuration counterpart is needed, and EL gas limit flags retain their existing pre-Gloas and local-tooling meaning. This EIP does not change gas limit selection before Gloas.&lt;/p&gt;

&lt;p&gt;Illustrative preference selection:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;effective_gas_limit_preference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;operator_preference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Optional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;existing_default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;scheduled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_scheduled_gas_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scheduled&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;operator_preference&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;operator_preference&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;existing_default&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;operator_preference&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scheduled&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;operator_preference&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scheduled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;warning&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;configured gas limit &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;operator_preference&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; exceeds the recommended &quot;&lt;/span&gt;
            &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;maximum of &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduled&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; at epoch &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;operator_preference&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The realized network gas limit continues to move under the &lt;a href=&quot;/EIPS/eip-1559&quot;&gt;EIP-1559&lt;/a&gt; ±1/1024 rule, so a scheduled increase plays out as a gradual, bounded ramp starting at the activation epoch rather than an instant step.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;why-epoch-based-defaults-instead-of-release-scoped-defaults&quot;&gt;Why epoch-based defaults instead of release-scoped defaults?&lt;/h3&gt;

&lt;p&gt;Keying the default on the duty’s epoch rather than the release version decouples &lt;em&gt;shipping&lt;/em&gt; a new gas limit from &lt;em&gt;activating&lt;/em&gt; it. This directly resolves the large-increase dilemma described in the Motivation: clients can ship the schedule entry for a big raise arbitrarily early, and no node will begin voting toward it until the configured epoch. An entry can align with a hard fork when desired, but the mechanism itself is only an epoch-based client configuration.&lt;/p&gt;

&lt;h3 id=&quot;why-one-value-for-both-the-default-and-the-recommended-maximum&quot;&gt;Why one value for both the default and the recommended maximum?&lt;/h3&gt;

&lt;p&gt;The number the community coordinates on for an epoch is the number the network runs at and the number operators are asked not to exceed. A single dial means there is no second parameter to negotiate or get out of sync, and no untested operating region between a default and a higher ceiling. Operators who want to run below it can; running above it is possible (nothing in consensus prevents it) but happens against a clear warning, which is a much stronger signal than today’s silently configurable free-for-all.&lt;/p&gt;

&lt;h3 id=&quot;why-does-the-schedule-live-only-on-the-consensus-layer&quot;&gt;Why does the schedule live only on the consensus layer?&lt;/h3&gt;

&lt;p&gt;Post-Gloas, the CL is authoritative for the gas limit in practice: the validator preference drives registrations, builder bids, and payload construction. A parallel execution layer schedule would be redundant configuration that could only ever agree with or diverge from the CL’s — and divergence is a new failure mode with no benefit. One schedule, in the layer that actually drives the value, is the minimal design. EL clients require no changes at all under this EIP.&lt;/p&gt;

&lt;h3 id=&quot;why-informational-rather-than-a-consensus-rule&quot;&gt;Why informational rather than a consensus rule?&lt;/h3&gt;

&lt;p&gt;An earlier draft of this EIP made the scheduled value a consensus-enforced maximum (and, before that, an exact-match requirement). This version is deliberately advisory:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Adoptability.&lt;/strong&gt; A recommendation requires no fork, no engine API changes, and no coordination risk. The configuration field is optional, so CL teams can adopt it independently and incrementally, and entries can activate at any coordinated post-Gloas epoch.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Validator sovereignty is preserved.&lt;/strong&gt; Gas limit choice remains, in the limit, with proposers — this EIP changes the &lt;em&gt;defaults and social convention&lt;/em&gt; around that choice, not the protocol.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;It solves the actual coordination problem.&lt;/strong&gt; The premature-voting and back-to-back-release problems are default-management problems, and defaults are client behavior. Consensus enforcement addresses a different (drift-above-tested-envelope) risk, and can be pursued later as a separate Core EIP layered on the same schedule if the community wants it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;why-warn-rather-than-clamp-out-of-range-preferences&quot;&gt;Why warn rather than clamp out-of-range preferences?&lt;/h3&gt;

&lt;p&gt;Clamping a preference down to the scheduled value would be enforcement — just relocated from consensus into the client. Without a consensus rule behind it, that would be dishonest in both directions: it implies a network ceiling that does not actually exist (any proposer running a non-conforming client could still exceed it), and it silently overrides an explicit operator decision that produces perfectly valid blocks. It would also fragment behavior across clients, since only those that adopt the optional schedule would clamp. A prominent warning keeps the mechanism honest: the schedule shapes defaults, and exceeding the recommended maximum remains possible but becomes a deliberate, visible act instead of a silent misconfiguration.&lt;/p&gt;

&lt;h3 id=&quot;relationship-to-eip-7935&quot;&gt;Relationship to EIP-7935&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7935&quot;&gt;EIP-7935&lt;/a&gt; recommended a single default (60M) tied to Fusaka’s activation. This EIP generalizes that one-off into a standing, machine-readable epoch schedule so future changes reuse the same mechanism instead of requiring a new EIP and a fresh round of client-default coordination.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;No consensus rules change and no blocks become invalid. Pre-Gloas behavior and existing operator settings remain unchanged. For post-Gloas duties covered by an active schedule entry, unconfigured validators derive their gas limit preference from the schedule instead of a hardcoded constant, and configured values above the scheduled maximum produce a warning but are honored. CL clients that do not adopt the field, and all EL clients, are unaffected. Tooling that reads &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block.gas_limit&lt;/code&gt; is unaffected.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The ceiling is advisory.&lt;/strong&gt; Nothing in consensus prevents a proposer from exceeding the scheduled value, so this EIP does not protect against a deliberately non-conforming actor. It does protect against the accidental paths — a default shipped early, a stale setting, an uncoordinated bump — which historically are how unintended gas limit movement happens. The ±1/1024 elasticity rule further rate-limits how fast any actor, conforming or not, can move the realized limit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Herding on the schedule.&lt;/strong&gt; If most validators follow the schedule, the network’s gas limit becomes highly predictable, which is the goal. It also means an error in a scheduled value propagates widely; scheduled values should receive the same devnet and worst-case-block testing that gas limit increases receive today (as described in &lt;a href=&quot;/EIPS/eip-7935&quot;&gt;EIP-7935&lt;/a&gt;) before being added to a network’s configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Partial adoption.&lt;/strong&gt; Because the field is optional, clients that do not support it keep their existing defaults, and their operators keep coordinating manually. The mechanism’s coordination benefit is proportional to adoption; a mixed network is no worse than today, since non-supporting clients behave exactly as they do now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Path to enforcement.&lt;/strong&gt; If the community later wants a hard guarantee that the network cannot exceed a tested envelope, a future Standards Track Core EIP can promote this schedule’s value to a consensus-enforced maximum without changing the configuration format.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8261</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8261</guid>
      </item>
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
      <item>
        <title>Builder Execution Requests</title>
        <description>
        &lt;p&gt;&lt;strong&gt;EIP #8282 - Builder Execution Requests&lt;/strong&gt; is in Last Call status. It is authored by Cayman (@wemeetagain), Nico Flaig &lt;nflaig@protonmail.com&gt;, Felix Lange &lt;fjl@ethereum.org&gt;, Justin Traglia &lt;jtraglia@ethereum.org&gt; and was originally created 2026-05-22. It is in the Core category of type Standards Track. Please review and note any changes that should block acceptance.&lt;/p&gt;
        
          &lt;p&gt;The author has requested that discussions happen at the following URL: &lt;a href=&quot;https://ethereum-magicians.org/t/eip-8282-builder-execution-requests/28699&quot;&gt;https://ethereum-magicians.org/t/eip-8282-builder-execution-requests/28699&lt;/a&gt;&lt;/p&gt;
        
        &lt;hr /&gt;
        &lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This EIP introduces two &lt;a href=&quot;/EIPS/eip-7685&quot;&gt;EIP-7685&lt;/a&gt; request types and corresponding predeploy contracts for &lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt; builders. A builder deposit contract handles initial registration and stake top-ups. A builder exit contract lets a builder’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_address&lt;/code&gt; trigger a full exit. Both contracts follow the request-bus pattern of &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt; and &lt;a href=&quot;/EIPS/eip-7251&quot;&gt;EIP-7251&lt;/a&gt;. Builders no longer onboard through the validator deposit flow or exit through the voluntary-exit operation.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt; introduces builders as a separate, staked consensus-layer actor, but reuses validator flows for their lifecycle. A builder is registered by a validator deposit whose withdrawal credential carries the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xB0&lt;/code&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_WITHDRAWAL_PREFIX&lt;/code&gt;, and it exits through a builder branch of the voluntary-exit operation. Dedicated builder request types improve on this in several ways.&lt;/p&gt;

&lt;p&gt;Dedicated types make the actor explicit from the request type alone. The consensus layer no longer routes deposits by inspecting credential prefixes, and the validator and builder registries are keyed independently.&lt;/p&gt;

&lt;p&gt;A builder deposit’s proof-of-possession is verified inline when the deposit is processed, unlike a validator deposit’s, which is deferred to the churn-limited &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pending_deposits&lt;/code&gt; queue. Builder deposits carried on the validator deposit request inherit its high per-payload ceiling. A dedicated request type isolates the verification work and caps it at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_DEPOSIT_REQUESTS_PER_BLOCK&lt;/code&gt; per block.&lt;/p&gt;

&lt;p&gt;Under &lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt;, a builder can only exit with a signature from its BLS key, the same hot key that signs its bids. The exit contract instead authorizes exit by the builder’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_address&lt;/code&gt;, as &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt; does for validators.&lt;/p&gt;

&lt;p&gt;Builders that must exist at the fork are unaffected. The &lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt; fork-transition onboarding of builder-credentialed pending deposits is retained, and only post-fork onboarding moves to the new contract.&lt;/p&gt;

&lt;h2 id=&quot;specification&quot;&gt;Specification&lt;/h2&gt;

&lt;p&gt;The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc2119&quot;&gt;RFC 2119&lt;/a&gt; and &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8174&quot;&gt;RFC 8174&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;constants&quot;&gt;Constants&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
      &lt;th&gt;Comment&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_DEPOSIT_CONTRACT_ADDRESS&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x0000bFF46984e3725691FA540a8C7589300D8282&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Predeploy address of the builder deposit contract&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_EXIT_CONTRACT_ADDRESS&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x000064D678505ad48F8cCb093BC65613800E8282&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Predeploy address of the builder exit contract&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_DEPOSIT_REQUEST_TYPE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x03&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/EIPS/eip-7685&quot;&gt;EIP-7685&lt;/a&gt; request-type byte for builder deposits&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_EXIT_REQUEST_TYPE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x04&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/EIPS/eip-7685&quot;&gt;EIP-7685&lt;/a&gt; request-type byte for builder exits&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYSTEM_ADDRESS&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xfffffffffffffffffffffffffffffffffffffffe&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Address that invokes the end-of-block system call (as in &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_DEPOSIT_REQUESTS_PER_BLOCK&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;64&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Maximum records the builder deposit contract drains into one block&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TARGET_DEPOSIT_REQUESTS_PER_BLOCK&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Per-block request count above which the fee rises for the deposit contract&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_EXIT_REQUESTS_PER_BLOCK&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;16&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Maximum records the builder exit contract drains into one block&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TARGET_EXIT_REQUESTS_PER_BLOCK&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Per-block request count above which the fee rises for the exit contract&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MIN_REQUEST_FEE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Minimum request fee, in wei&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;REQUEST_FEE_UPDATE_FRACTION&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;17&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Controls the fee’s rate of change&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_MIN_DEPOSIT&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1000000000000000000&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Minimum credited stake for a deposit, in wei (1 ETH — the &lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt; builder minimum)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_DEPOSIT_CONTRACT_RUNTIME_CODE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;see &lt;a href=&quot;#reference-implementation&quot;&gt;Reference Implementation&lt;/a&gt;&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;Runtime bytecode of the builder deposit contract&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_EXIT_CONTRACT_RUNTIME_CODE&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;see &lt;a href=&quot;#reference-implementation&quot;&gt;Reference Implementation&lt;/a&gt;&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;Runtime bytecode of the builder exit contract&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Final request-type values MUST be unique across all active &lt;a href=&quot;/EIPS/eip-7685&quot;&gt;EIP-7685&lt;/a&gt; request types. Allocation is coordinated in consensus-specs, where the existing types are defined (&lt;a href=&quot;https://github.com/ethereum/consensus-specs/blob/e310d1c0d316e4dcc822164966c5bfa592adae2b/specs/electra/beacon-chain.md&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;electra/beacon-chain.md&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;

&lt;h3 id=&quot;deployment&quot;&gt;Deployment&lt;/h3&gt;

&lt;p&gt;Both contracts are deployed by a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CREATE2&lt;/code&gt; factory (&lt;a href=&quot;/EIPS/eip-7997&quot;&gt;EIP-7997&lt;/a&gt;). Each address is determined by the factory, a salt, and the contract’s init code. The salt was mined so that the addresses above result from the current reference bytecode.&lt;/p&gt;

&lt;p&gt;The contracts MUST be deployed before the fork that activates this EIP. If there is no code at either address once the EIP is active, every block from activation onward MUST be invalid.&lt;/p&gt;

&lt;h3 id=&quot;request-queue-and-system-call&quot;&gt;Request queue and system call&lt;/h3&gt;

&lt;p&gt;Both predeploys follow the &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt; and &lt;a href=&quot;/EIPS/eip-7251&quot;&gt;EIP-7251&lt;/a&gt; contract design, with minor tweaks, and reuse their storage layout. There is no Solidity-compatible ABI. Each contract dispatches on the caller and on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calldatasize&lt;/code&gt; alone. Calls that match none of the cases below MUST revert.&lt;/p&gt;

&lt;h4 id=&quot;write-path&quot;&gt;Write path&lt;/h4&gt;

&lt;p&gt;A call from any address other than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYSTEM_ADDRESS&lt;/code&gt;, with calldata of exactly the contract’s input size, submits a request. The contract MUST validate the request and the value sent (see below), append one record to its queue, increment the per-block count, and emit the accepted record as an anonymous log.&lt;/p&gt;

&lt;h4 id=&quot;fee-getter&quot;&gt;Fee getter&lt;/h4&gt;

&lt;p&gt;A call from any address other than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYSTEM_ADDRESS&lt;/code&gt;, with empty calldata, returns the current fee without modifying state. The contract MUST revert if any value is attached.&lt;/p&gt;

&lt;h4 id=&quot;system-call&quot;&gt;System call&lt;/h4&gt;

&lt;p&gt;At the end of each block, the contract is called by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYSTEM_ADDRESS&lt;/code&gt;. If any calldata is included, the queue is permanently disabled via an inhibitor. If no calldata is included, it MUST dequeue up to its per-block maximum of records (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_DEPOSIT_REQUESTS_PER_BLOCK&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAX_EXIT_REQUESTS_PER_BLOCK&lt;/code&gt;, oldest first), return their concatenation as its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;request_data&lt;/code&gt;, and reset the per-block count. Records beyond the cap remain queued for subsequent blocks.&lt;/p&gt;

&lt;p&gt;The execution layer prepends the contract’s request-type byte and includes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;request_type ++ request_data&lt;/code&gt; in the block requests list, committed via the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requests_hash&lt;/code&gt; (&lt;a href=&quot;/EIPS/eip-7685&quot;&gt;EIP-7685&lt;/a&gt;). The system call follows the same rules as in &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt;. It runs with a dedicated gas limit of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;30_000_000&lt;/code&gt; that does not count against the block gas limit. If either contract’s system call fails, the block MUST be invalid.&lt;/p&gt;

&lt;h3 id=&quot;request-fee&quot;&gt;Request fee&lt;/h3&gt;

&lt;p&gt;Each request carries a fee, computed as in &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;fee = fake_exponential(MIN_REQUEST_FEE, excess, REQUEST_FEE_UPDATE_FRACTION)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fake_exponential&lt;/code&gt; is the &lt;a href=&quot;/EIPS/eip-1559&quot;&gt;EIP-1559&lt;/a&gt;-style integer approximation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MIN_REQUEST_FEE * e**(excess / REQUEST_FEE_UPDATE_FRACTION)&lt;/code&gt;. The fee rises super-linearly while blocks contain more than the target number of requests and decays back to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MIN_REQUEST_FEE&lt;/code&gt; otherwise. It is charged on top of any staked value and is left locked in the contract.&lt;/p&gt;

&lt;p&gt;Both contracts are modified to apply fee increases for each write path, rather than at end-of-block, as in &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;deposit-requests&quot;&gt;Deposit requests&lt;/h3&gt;

&lt;p&gt;A deposit request is submitted by calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_DEPOSIT_CONTRACT_ADDRESS&lt;/code&gt; with calldata of exactly &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;184&lt;/code&gt; bytes:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Bytes&lt;/th&gt;
      &lt;th&gt;Field&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0:48&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pubkey&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;48-byte BLS public key&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;48:80&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;withdrawal_credentials&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;32-byte commitment (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;version&lt;/code&gt; byte + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_address&lt;/code&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;80:88&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;amount&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Big-endian &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint64&lt;/code&gt;, in gwei&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;88:184&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signature&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;96-byte BLS proof-of-possession&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;A deposit request serves both a builder’s first deposit and subsequent top-ups. The contract MUST reject the request unless &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;amount * 1 gwei &amp;gt;= BUILDER_MIN_DEPOSIT&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;msg.value &amp;gt;= amount * 1 gwei + fee&lt;/code&gt;. Any value beyond &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;amount * 1 gwei + fee&lt;/code&gt; is retained by the contract and not credited to the builder.&lt;/p&gt;

&lt;p&gt;On success the contract queues the 184 input bytes. The dequeued record is the input verbatim with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;amount&lt;/code&gt; converted to little-endian, as in &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt;. The contract does not verify the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signature&lt;/code&gt;. It is carried in the record and verified by the consensus layer. Submitters SHOULD verify the proof-of-possession off-chain before broadcasting a first deposit.&lt;/p&gt;

&lt;h3 id=&quot;exit-requests&quot;&gt;Exit requests&lt;/h3&gt;

&lt;p&gt;An exit request is submitted by calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_EXIT_CONTRACT_ADDRESS&lt;/code&gt; with calldata of exactly &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;48&lt;/code&gt; bytes, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pubkey&lt;/code&gt; of the builder to exit. The contract MUST require &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;msg.value &amp;gt;= fee&lt;/code&gt;. No value is staked. On success it queues a record of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source_address (20) ++ pubkey (48)&lt;/code&gt;, where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source_address&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;msg.sender&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Authorization is by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source_address&lt;/code&gt;, as in &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt;. The contract records &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;msg.sender&lt;/code&gt; and performs no further check. The consensus layer honors the request only when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source_address&lt;/code&gt; equals the target builder’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_address&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;consensus-layer-processing&quot;&gt;Consensus layer processing&lt;/h3&gt;

&lt;p&gt;The consensus layer decodes each dequeued record into one of two SSZ containers, selected by request type:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BuilderDepositRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pubkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bytes48&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;withdrawal_credentials&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bytes32&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;amount&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uint64&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Gwei
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;signature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bytes96&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BuilderExitRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;source_address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bytes20&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pubkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Bytes48&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A type’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;request_data&lt;/code&gt; is the concatenation of the fixed-size SSZ serializations of its records, which is exactly the bytes the system call returns, in the same order. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderDepositRequest&lt;/code&gt; is the &lt;a href=&quot;/EIPS/eip-6110&quot;&gt;EIP-6110&lt;/a&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DepositRequest&lt;/code&gt; without the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;Detailed state-transition behavior is specified in consensus-specs. In summary:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderDepositRequest&lt;/code&gt; for a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pubkey&lt;/code&gt; not in the builder registry registers a new builder if its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signature&lt;/code&gt; is a valid proof-of-possession over &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(pubkey, withdrawal_credentials, amount)&lt;/code&gt; under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DOMAIN_BUILDER_DEPOSIT&lt;/code&gt;, a builder-specific signing domain. A record with an invalid signature is ignored and its stake forfeited. Deposits are applied immediately rather than routed through the validator &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pending_deposits&lt;/code&gt; queue.&lt;/li&gt;
  &lt;li&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderDepositRequest&lt;/code&gt; for an already-registered &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pubkey&lt;/code&gt; is a top-up. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;amount&lt;/code&gt; is credited and the record’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;withdrawal_credentials&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signature&lt;/code&gt; are ignored, as with validator deposits.&lt;/li&gt;
  &lt;li&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BuilderExitRequest&lt;/code&gt; initiates a full exit only if its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pubkey&lt;/code&gt; is an active builder, its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source_address&lt;/code&gt; equals that builder’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_address&lt;/code&gt;, and the builder has no pending balance to withdraw. Otherwise the record is dropped rather than re-queued, and the request must be resubmitted.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;changes-to-eip-7732&quot;&gt;Changes to EIP-7732&lt;/h3&gt;

&lt;h4 id=&quot;deposit-routing&quot;&gt;Deposit routing&lt;/h4&gt;

&lt;p&gt;The builder branch of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_deposit_request&lt;/code&gt; is removed, so a deposit to the validator deposit contract is always an ordinary validator deposit. Builders are created and topped up only through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_DEPOSIT_REQUEST_TYPE&lt;/code&gt;. A post-fork deposit to the validator contract with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xB0&lt;/code&gt; credential mints a validator that cannot withdraw its balance, so builder deposits MUST be sent to the builder deposit contract.&lt;/p&gt;

&lt;h4 id=&quot;fork-transition-onboarding&quot;&gt;Fork-transition onboarding&lt;/h4&gt;

&lt;p&gt;The one-time &lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt; onboarding of builder-credentialed pending deposits at the fork is retained, so builders exist from the first slot. This is the only path that onboards builders through the validator deposit contract. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0xB0&lt;/code&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_WITHDRAWAL_PREFIX&lt;/code&gt; is deprecated afterward.&lt;/p&gt;

&lt;h4 id=&quot;exit-routing&quot;&gt;Exit routing&lt;/h4&gt;

&lt;p&gt;The builder branch of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;process_voluntary_exit&lt;/code&gt; is removed, making the voluntary-exit operation validator-only. Builders exit only through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_EXIT_REQUEST_TYPE&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;rationale&quot;&gt;Rationale&lt;/h2&gt;

&lt;h3 id=&quot;two-predeploys-two-request-types&quot;&gt;Two predeploys, two request types&lt;/h3&gt;

&lt;p&gt;This mirrors withdrawals (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x01&lt;/code&gt;) and consolidations (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x02&lt;/code&gt;). The execution layer needs no new read semantics, and the consensus layer routes by request type rather than by inspecting credentials.&lt;/p&gt;

&lt;h3 id=&quot;one-request-for-deposits-and-top-ups&quot;&gt;One request for deposits and top-ups&lt;/h3&gt;

&lt;p&gt;This matches the validator deposit contract. The proof-of-possession is checked on a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pubkey&lt;/code&gt;’s first appearance, and later deposits credit stake. A top-up cannot redirect a builder’s withdrawals because its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;withdrawal_credentials&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;signature&lt;/code&gt; are ignored.&lt;/p&gt;

&lt;h3 id=&quot;exit-by-execution_address&quot;&gt;Exit by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_address&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;A builder’s BLS key is hot, since it signs bids continuously, so it should not also authorize exits. Routing exit through the cold &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_address&lt;/code&gt; mirrors the &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt; rationale for validator withdrawal credentials and gives builders a single, well-defined exit authorizer.&lt;/p&gt;

&lt;h3 id=&quot;request-fee-1&quot;&gt;Request fee&lt;/h3&gt;

&lt;p&gt;The same demand-responsive fee as &lt;a href=&quot;/EIPS/eip-7002&quot;&gt;EIP-7002&lt;/a&gt; and &lt;a href=&quot;/EIPS/eip-7251&quot;&gt;EIP-7251&lt;/a&gt; meters submission, together with the per-block caps and the per-deposit stake.&lt;/p&gt;

&lt;h3 id=&quot;onboarding-at-the-fork&quot;&gt;Onboarding at the fork&lt;/h3&gt;

&lt;p&gt;Some applications depend on builders existing from the first slot of the fork, which post-fork deposits to the new contract cannot provide. The existing &lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt; onboarding path is therefore retained for the initial builder set.&lt;/p&gt;

&lt;h2 id=&quot;backwards-compatibility&quot;&gt;Backwards Compatibility&lt;/h2&gt;

&lt;p&gt;This EIP is additive at the execution layer. It introduces new contracts at previously empty addresses and does not modify the validator deposit contract or the validator request predeploys. At the consensus layer it modifies the &lt;a href=&quot;/EIPS/eip-7732&quot;&gt;EIP-7732&lt;/a&gt; builder lifecycle as described in &lt;a href=&quot;#changes-to-eip-7732&quot;&gt;Changes to EIP-7732&lt;/a&gt;. Builders onboarded at the fork are unaffected.&lt;/p&gt;

&lt;h2 id=&quot;reference-implementation&quot;&gt;Reference Implementation&lt;/h2&gt;

&lt;p&gt;See &lt;a href=&quot;https://github.com/ethereum/sys-asm/tree/3bba94c696bc46beeecef05db6c2df0f18b4b239/src/builder_deposits&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/builder_deposits&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/ethereum/sys-asm/tree/3bba94c696bc46beeecef05db6c2df0f18b4b239/src/builder_exits&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/builder_deposits&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;security-considerations&quot;&gt;Security Considerations&lt;/h2&gt;

&lt;h3 id=&quot;exit-authorization&quot;&gt;Exit authorization&lt;/h3&gt;

&lt;p&gt;The exit contract records &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;msg.sender&lt;/code&gt; as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source_address&lt;/code&gt; and performs no further check. The request carries no signature, so the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source_address&lt;/code&gt; check during &lt;a href=&quot;#consensus-layer-processing&quot;&gt;consensus layer processing&lt;/a&gt; is the only exit authorization; without it an arbitrary caller could exit any builder.&lt;/p&gt;

&lt;h3 id=&quot;signing-domain-separation&quot;&gt;Signing-domain separation&lt;/h3&gt;

&lt;p&gt;Builder deposits are signed under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DOMAIN_BUILDER_DEPOSIT&lt;/code&gt;, distinct from the validator &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DOMAIN_DEPOSIT&lt;/code&gt;, so deposit proofs-of-possession cannot be replayed across the two classes. Fork-transition seed deposits are made through the validator deposit contract and are necessarily signed under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DOMAIN_DEPOSIT&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;replayable-deposit-records&quot;&gt;Replayable deposit records&lt;/h3&gt;

&lt;p&gt;A deposit’s fields are public in calldata, so a third party can resubmit them for an already-registered builder at an amount it funds itself. Such a replay is a top-up whose credentials and signature are ignored. It credits stake and redirects nothing.&lt;/p&gt;

&lt;h3 id=&quot;custodial-split-exit-standoff&quot;&gt;Custodial-split exit standoff&lt;/h3&gt;

&lt;p&gt;Exit requires a zero pending balance, every winning bid adds pending balance, and only the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_address&lt;/code&gt; can authorize exit. Where the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution_address&lt;/code&gt; (capital owner) and the BLS key (bidding operator) are held by different parties, an operator that keeps winning bids can indefinitely block the owner’s exit. Delegating parties should retain off-chain control over the operator’s bidding.&lt;/p&gt;

&lt;h3 id=&quot;spam-and-state-growth&quot;&gt;Spam and state growth&lt;/h3&gt;

&lt;p&gt;The per-block caps bound the drain rate, not enqueue, so the in-state queues can grow across blocks. Growth is gated by value, since each deposit locks at least &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILDER_MIN_DEPOSIT&lt;/code&gt; plus the fee. An attacker submitting valid proofs-of-possession forfeits nothing, because the stake remains a withdrawable builder balance, so post-fork onboarding can be delayed behind a backlog of attacker deposits at the cost of locked capital. This is tolerable because the time-critical initial builder set is seeded through the fork transition rather than the steady-state contract.&lt;/p&gt;

&lt;h3 id=&quot;locked-funds&quot;&gt;Locked funds&lt;/h3&gt;

&lt;p&gt;The request fee, any overpayment, and the principal of a first deposit that the consensus layer rejects for an invalid proof-of-possession are permanently locked in the predeploy. The execution layer does not verify BLS signatures, so the off-chain proof-of-possession check advised in &lt;a href=&quot;#deposit-requests&quot;&gt;Deposit requests&lt;/a&gt; is a submitter’s only protection against losing a first deposit’s principal.&lt;/p&gt;

&lt;h2 id=&quot;copyright&quot;&gt;Copyright&lt;/h2&gt;

&lt;p&gt;Copyright and related rights waived via &lt;a href=&quot;/LICENSE&quot;&gt;CC0&lt;/a&gt;.&lt;/p&gt;

      </description>
        <pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate>
        <link>https://eips.ethereum.org//EIPS/eip-8282</link>
        <guid isPermaLink="true">https://eips.ethereum.org//EIPS/eip-8282</guid>
      </item>
      
      
    
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
    
      
      
      
    
  </channel>
</rss>
