Skip to content

Conversation

gballet
Copy link
Member

@gballet gballet commented Jun 23, 2025

This PR revives eip 2926 based on a conversation that happened during the Berlin interop. The idea is to strip the verkle/binary/tree EIPs down to the most valuable piece for the medium-term Ethereum roadmap: code chunking.

There is a significant overhaul of this EIP:

  • Code size and hash are stored at the account level, not in the tree. A new field for the code chunk root hash is added.
  • Only the version is stored in the tree, alongside the code chunks
  • Tree is expected to be MPT, to be later replaced with a single tree version, e.g. in eip-7864
  • It doesn't restrict the depth of the tree, so that code length can go beyond 2MB
  • It adapts the conversion from eip 7612 to this new version

Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
@gballet gballet requested a review from eth-bot as a code owner June 23, 2025 13:30
@github-actions github-actions bot added c-update Modifies an existing proposal s-stagnant This EIP is Stagnant t-core labels Jun 23, 2025
@eth-bot
Copy link
Collaborator

eth-bot commented Jun 23, 2025

✅ All reviewers have approved.

@eth-bot eth-bot added the a-review Waiting on author to review label Jun 23, 2025
@eth-bot eth-bot changed the title eip-2926: revive eip-2926 to introduce code chunking in glamsterdam Update EIP-2926: revive eip-2926 to introduce code chunking in glamsterdam Jun 23, 2025
@github-actions github-actions bot added the w-ci Waiting on CI to pass label Jun 23, 2025
Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
EIPS/eip-2926.md Outdated

## Rationale

### Hexary vs binary trie

The Ethereum mainnet state is encoded as of now in a hexary Merkle Patricia Tree. As part of the Eth1x roadmap, a transition to a [binary trie](https://ethresear.ch/t/binary-trie-format/7621) has been [investigated](https://medium.com/@mandrigin/stateless-ethereum-binary-tries-experiment-b2c035497768) with the goal of reducing witness sizes. Because code chunks are also stored in the trie, this EIP would benefit from the witness size reduction offered by the binarification. Therefore we have decided to explicitly state [EIP-2584](./eip-2584.md) to be a requirement of this change. Note that if code merkleization is included in a hard-fork beforehand, then all code must be re-merkleized after the binary transition.
The trie format is chosen to be the same as that of the account trie. If a tree conversion happens at a later stage, the chunk tree will have to be converted as well, e.g. the way it is in [EIP-6800](./eip-6800.md) or [EIP-76i84](./eip-7684.md).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo EIP-76i84 -> EIP-7684

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wait is it the right EIP though?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah I think you meant EIP7864?

@github-actions github-actions bot removed the w-ci Waiting on CI to pass label Jun 23, 2025
EIPS/eip-2926.md Outdated
@@ -113,26 +110,6 @@ Additionally we have reviewed many other options (basic block based, Solidity su

To remain consistent with the binary transition proposal we avoid using RLP for serializing the leaf values. We have furthermore considered SSZ for both serializing data and merkleization and remain open to adopting it, but decided to use the binary trie format for simplicity.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment on "binary trie format" can have more clarity. I'm personally not sure what it's referring to.

Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
lightclient
lightclient previously approved these changes Jun 23, 2025
Copy link
Member

@lightclient lightclient left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM - just need a thumbs up from @s1na or @axic

Copy link
Member

@jochem-brouwer jochem-brouwer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I likely left some "dumb" comments of me not understanding specific parts 😄 👍

I think a "big topic" to discuss here would be the transition logic, this will get complex to determine new-accounts which are already in the new format and old-accounts which need to be converted. We could also go for a touch-format (convert account if it is touched) but then we get ourselves in the realm again of "cleaning up empty accounts" which is also not nice. Have to give this transition stuff some thought.

I think ITERATOR_STRIDE is too big, this converts 50k accounts and the logic of this is non-trivial plus we also have to calculate the code roots. (Will need to bench this).

I like the code merklization format in the trie. I might have left some comments while thinking about interpreting the new trie format while I was not fully understanding it yet, but will leave the comments there so the "train of thought" can be followed as well 😄 👍

I think we should put a small note of max code size as well, this is (2^(4*8) - 1) // 32 * 31 (??). Otherwise it will not fit in the reserved code space (?) (please check my formula) 😄 👍

- `code_0 || ... || code_n == C`.
- `length(code_i) == CHUNK_SIZE` where `0 <= i < n`.
- `length(code_n) <= CHUNK_SIZE`.
- `FIO_i` is the offset of the first instruction within the chunk. It should only be greater than zero if the last instruction in `code_i-1` is a multi-byte instruction (like `PUSHN`) crossing the chunk boundary. It is set to `CHUNK_SIZE` in the case where all bytes of a chunk are data.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(FIO = First Instruction Offset (Assuming this is the abbreviation, I think great to mention somewhere before for clarity 😄 👍 ))

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Just writing this down for myself for clarity)

If we have C = PUSH32 x STOP then we get:

0x00 0x79 x[1:31] (chunk 0)
0x02 x[31:] 00 (chunk 1)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's confusing that x is indexed starting from 1 and also that the upper bound b in [a:b] isn't included, but it's correct.

- `FIO_i` is the offset of the first instruction within the chunk. It should only be greater than zero if the last instruction in `code_i-1` is a multi-byte instruction (like `PUSHN`) crossing the chunk boundary. It is set to `CHUNK_SIZE` in the case where all bytes of a chunk are data.
- `A.codeSize = BE()`
- `A.codeRoot` contains the root of `codeTrie`, a trie with the following leaves:
- Key: `VERSION_KEY`, value: `BE(VERSION, 1)`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So VERSION_KEY is max(u256) -> this key is thus 0xffff..ff? (32 bytes key?). The value is 0x00 and not 0x? Storing 0x00 in a storage trie in MPT would delete the value, not store it (from EVM point of view). Likely want to set this version to 1 maybe for clarity? Or make this indeed the empty bytes and not store this? (Difference between storing nothing, the empty bytes, and the 1-byte 0x00, so three different options here I think!)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good point, I think it should be version 0 and then set to 1 if there is another version in the future.


The `i`th element of `chunks` is stored in `codeTrie` with:

- Key: `BE(i, KEY_LENGTH)`
- Key: `BE(i, 4)`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think for MPT implementations the leading zero bytes are stripped of the key... right?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think for key we can just use the big-endian reprenstation of i, with stripped zeros at the front (?). We might reserve however in the code trie the keys of 4 bytes for code sections and thus reserve anything else (> 4 byte keys) to store different things (I think this is the idea?).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leading zero bytes are preserved in the key (see geth's imp). And if we do strip them off, then we might run into key collisions.

EIPS/eip-2926.md Outdated

### Updating existing code (transition process)

The transition process involves reading all contracts in the state and applying the above procedure to them. A benchmark showing how long this process will take is still pending, but intuitively it should take longer than the time between two blocks (in the order of hours). Hence we recommend clients to pre-process the changes before the EIP is activated.
The transition process involves reading all contracts in the state and applying the above procedure to them. A process simiar to [EIP-7612](./eip-7612.md) is to be used, as the total code size at the time of this EIP edit is >10GB and can not be processed in a single block. Nonetheless, the conversion process should take minutes instead of days for a full tree conversion.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(I would argue hours here, we have 1.5M+ unique codeHashes and not sure how many accounts we should transition to here)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you meant that the transition process should read all accounts instead of contracts? At least in Geth, there's no way of iterating only the contract accounts.

Copy link
Contributor

@weiihann weiihann Jun 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The transition does take about 1 and half day as we need to iterate all of the accounts, but the actual code conversion time should only take minutes. I think we can add more clarifications between the transition and the code conversion. Or we don't have to mention this code conversion part at all.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pushing some update in a minute, let me know if that solves your questions.

EIPS/eip-2926.md Outdated
At block `HF_BLOCK_NUMBER` when the EIP gets activated, before executing any transaction the client must update the account record for all contracts with non-empty code in the state to replace the `codeHash` field with the pre-computed `codeRoot`. EoA accounts will keep their `codeHash` value as `codeRoot`. *Accounts with empty code will keep their `codeHash` value as `codeRoot`.*
- any contract creationi and 7702 delegation updates must use the new format.
- for 7702 accounts, the code size is set to `23`, and any call checking the code size/hash are forwarded to the delegated account.
- after executing any transaction, the client must convert `ITERATOR_STRIDE` accounts in the tree.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This process has to be specified, especially for newly created accounts. For new accounts we should thus dump (?) the new format. For the iterator, we thus skip over the already-converted accounts? As remark this conversion thus only works if it is not possible to create more than ITERATOR_STRIDE new accounts per block (?) otherwise the iterator will never end (theoretical DoS vector, in practice this should not happen).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Assuming 30M gas limit, new account creation occurs only via ether transfers (21000 gas cost).
30000000 / 21000 = ~1428 accounts per block

So the current ITERATOR_STRIDE value will not be a DoS vector.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree further explanation in this procedure is required. Too much stuff in the air otherwise.

EIPS/eip-2926.md Outdated
How merkleized code is stored in the client database affects the performance of code-accessing opcodes, i.e: CALL, CALLCODE, DELEGATECALL, STATICCALL, EXTCODESIZE, EXTCODEHASH, and EXTCODECOPY. Storing the code trie with all intermediate nodes in the database implies multiple look-ups to fetch the code of the callee, which is more than the current one look-up (excluding the trie traversal to get the account) required. Note CODECOPY and CODESIZE are not affected since the code for the current contract has already been loaded to memory.

The gas cost analysis in this section assumes a specific way of storing it. In this approach clients only merkleize code once during creation to compute `codeRoot`, but then discard the chunks. They instead store the full bytecode as well as the metadata fields in the database. We believe per-chunk metering for calls would be more easily solvable by witness metering in the stateless model.
Details of how the code is stored, is left to the client implementers. However, to reflect the removal of the max code limit and the fact that larger codes will be more expensive to load, a uniform read access cost of 200 warming read cost and an extra 500 write costs are being charged.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this EIP remove the max code size limit?

200 gas/byte deposit -> 500 gas/byte deposit costs are clear in the EIP, but not the 200 warming read costs. What is this and when is this being charged?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reformulated, let me know what you think.

EIPS/eip-2926.md Outdated
@@ -151,11 +128,12 @@ Show the `codeRoot` for the following cases:

## Implementation

The implementation of the chunking and merkleization logic in Typescript can be found [here](https://github.com/ewasm/biturbo/blob/merklize-mainnet-blocks/src/relayer/bytecode.ts#L172), and in Python [here](https://github.com/hugo-dc/code-chunks/). Please note neither of these examples currently use a binary tree.
The implementation for the previous version of this EIP, i.e. the chunking and merkleization logic in Typescript can be found [here](https://github.com/ewasm/biturbo/blob/merklize-mainnet-blocks/src/relayer/bytecode.ts#L172), and in Python [here](https://github.com/hugo-dc/code-chunks/). Please note neither of these examples currently use a binary tree.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(note: I did not check these URLs)

Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
- `VERSION_KEY`: `0xfffd`
- `CODELEN_KEY`: `0xfffe`
- `CODEHASH_KEY`: `0xffff`
- `VERSION_KEY`: `max(u256)`
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why would you waste 32 bytes on this when a byte or 2 might suffice. Even u64

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh nvm. Storage slot is going to consume 256bits anyways I see. Can't we mix it with another field or similar? Such that both meld into one?

- Value: `BE(FIO_i, 1) || code_i`, where `||` stands for byte-wise concatenation

#### Contract creation gas cost

As of now there is a charge of 200 gas per byte of the code stored in state by contract creation operations, be it initiated via `CREATE`, `CREATE2`, or an external transaction. This per byte cost is to be increased from `200` to `TBD` to account for the chunking and merkleization costs.
As of now there is a charge of 200 gas per byte of the code stored in state by contract creation operations, be it initiated via `CREATE`, `CREATE2`, or an external transaction. This per byte cost is to be increased from `200` to `500` to account for the chunking and merkleization costs. This number is inherited from [EIP-4762](./eip-4762.md) and is picked for forward-compatibility.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For reference. In current deployments, the gas/byte cost is 202 gas/byte. So we should at the very least match it or make it more expensive (as deploying is the cheapest way to introduce data within the DB). And it's way cheaper than a simple SSTORE with 625 gas/byte.

EIPS/eip-2926.md Outdated
At block `HF_BLOCK_NUMBER` when the EIP gets activated, before executing any transaction the client must update the account record for all contracts with non-empty code in the state to replace the `codeHash` field with the pre-computed `codeRoot`. EoA accounts will keep their `codeHash` value as `codeRoot`. *Accounts with empty code will keep their `codeHash` value as `codeRoot`.*
- any contract creationi and 7702 delegation updates must use the new format.
- for 7702 accounts, the code size is set to `23`, and any call checking the code size/hash are forwarded to the delegated account.
- after executing any transaction, the client must convert `ITERATOR_STRIDE` accounts in the tree.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree further explanation in this procedure is required. Too much stuff in the air otherwise.

- for 7702 accounts, the code size is set to `23`, and any call checking the code size/hash are forwarded to the delegated account.
- after executing any transaction, the client must convert `ITERATOR_STRIDE` accounts in the tree.

The value for `ITERATOR_STRIDE` has been chosen to be safe while ensuring the transition process does not last too long. At the current state size and block time, this represents about 10000 blocks, which is about one and a half day.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does "safely" mean here? Any ideas on how minimal-hardware requirements (#9270) is affected by this parameters and if it can keep up?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to do a benchmark for this. One of the possible scenarios that I can think of:

With the given hardware, calculate the time taken to process the worst case, which is 50000 contract accounts, each with distinct bytecode and is 24kB. If the code size limit increases to 256kB, then we need to adjust accordingly.

We also need to simulate the worst case conversion on real-time block processing, since there is resource contention.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agreed, after the spec stage is done. So far, it's a back-of-the-envelope computation based on the performance of verkle.

Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
@github-actions github-actions bot added the w-ci Waiting on CI to pass label Jun 24, 2025
Copy link
Member

@jochem-brouwer jochem-brouwer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed the latest commit! Have to sit down and read the entire EIP changes again, but commit itself has already cleared up a lot, thanks for that 😄 👍

EIPS/eip-2926.md Outdated
- any contract creation and 7702 delegation updates must use the new format.
- for 7702 accounts, the code size is set to `23`, and `CODESIZE`/`CODECOPY` are forwarded to the delegated account. `EXTCODESIZE`/`EXTCODEHASH`/`EXTCODECOPY` behave the same as they did before the activation of this EIP.
- accounts are NOT converted in case of a balance or nonce update
- after executing any transaction, the client iteraters over `ITERATOR_STRIDE` accounts in the tree, and for each account:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this intended after each transaction, or after each block? (I would assume block?). I think this needs some pseudocode, we likely want to do the proposed logic as in the tree transition EIPs. Thus we iterate the tree starting on the "left" (lowest values when interpreting keys as big-endian) and iterate over the leaves, ITERATOR_STRIDE each time and either convert or do not convert, and leave the current key we are at in the database. (init value of this key is thus 0, and we start at that value)

@@ -92,7 +103,7 @@ Note: there could be an edge case when computing FIO for the chunks where the da

### Gas cost of code-accessing opcodes

Details of how the code is stored, is left to the client implementers. However, to reflect the removal of the max code limit and the fact that larger codes will be more expensive to load, a uniform read access cost of 200 warming read cost and an extra 500 write costs are being charged.
Details of how the code is stored, is left to the client implementers. However, to reflect the removal of the max code limit and the fact that larger codes will be more expensive to load, reading a non-accessed chunk will incur a 200 warming cost, and chunks written beyond the 24kb limit will cost 500 gas instead of 200.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just realized that this might be a big problem, especially in the sense of EXTCODECOPY. I assume that we also charge these gas costs. We will need to analyze if this breaks anything, because this will now massively increase the cost of copying large amounts (for instance copying all the code of a contract).

Reading after 24 KiB limit does this incur a read cost of 500 gas? (It now says "written" which might be confused with code deposit?)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We also need to specify how we track the accessed code chunks. It is clear from a transaction which has non-reverting/aborting call frames. But what if a call frame aborts? Is the code accessed in that frame then still considered "accessed"? (I would assume: yes, but then we have to specify this 😄 👍 )

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is normal that this increases the cost of reading code, but I don't see how it would break contracts beyond requiring more gas.

Reading after 24 KiB limit does this incur a read cost of 500 gas? (It now says "written" which might be confused with code deposit?)

what do you mean by "code deposit"? the 500 is a cost you pay for writing code, not reading. The reading cost is 200, as explained by the warming comment on the next line.

, but then we have to specify this

it is specified, since we are talking about "warming" costs. Once this is warm, it's free.

gballet added 2 commits July 1, 2025 13:27
Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
@github-actions github-actions bot removed the w-ci Waiting on CI to pass label Jul 1, 2025
Copy link
Contributor

@s1na s1na left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me

@g11tech g11tech closed this Jul 2, 2025
@g11tech g11tech reopened this Jul 2, 2025
EIPS/eip-2926.md Outdated
@@ -151,11 +136,12 @@ Show the `codeRoot` for the following cases:

## Implementation
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This section is obsolete per current EIP rules so can be just removed.

EIPS/eip-2926.md Outdated
- Value: `BE(FIO_i, 1) || code_i`, where `||` stands for byte-wise concatenation

If `C` is empty, `A.codeRoot` and `A.codeSize` are omitted from the account's RLP. This is intended to limit the size overhead of this change.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd put this as the first case, as it is shorter, plus makes it clear what happens for EOAs.

EIPS/eip-2926.md Outdated
- Value: `BE(FIO_i, 1) || code_i`, where `||` stands for byte-wise concatenation

If `C` is empty, `A.codeRoot` and `A.codeSize` are omitted from the account's RLP. This is intended to limit the size overhead of this change.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would perhaps add a comment that this is an "EOA" in practice.

@@ -30,57 +30,67 @@ This specification assumes that [EIP-2584](./eip-2584.md) is deployed, and the m
#### Constants

- `CHUNK_SIZE`: 32 (bytes)
- `KEY_LENGTH`: 2 (bytes)
- `MAX_CHUNK_COUNT`: `0xfffc`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't remember why we had this configurable, @s1na ?

@@ -1,13 +1,13 @@
---
eip: 2926
title: Chunk-Based Code Merkleization
author: Sina Mahmoodi (@s1na), Alex Beregszaszi (@axic)
author: Sina Mahmoodi (@s1na), Alex Beregszaszi (@axic), Guillaume Ballet (@gballet), Jochem Brouwer (@jochem-brouwer), Ignacio Hagopian (@jsign)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally agree with picking this EIP and modifying it for today's context. Let's sort out most of the comments on this PR before merging.

Will approve from my side after that, just to avoid having inconsistent versions merged.

cc @s1na

@github-actions github-actions bot added c-status Changes a proposal's status s-draft This EIP is a Draft and removed c-update Modifies an existing proposal s-stagnant This EIP is Stagnant labels Jul 13, 2025
g11tech
g11tech previously approved these changes Jul 13, 2025
@eth-bot eth-bot changed the title Update EIP-2926: revive eip-2926 to introduce code chunking in glamsterdam Update EIP-2926: Move to Draft Jul 13, 2025
@eth-bot eth-bot enabled auto-merge (squash) July 13, 2025 12:54
Copy link
Collaborator

@eth-bot eth-bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All Reviewers Have Approved; Performing Automatic Merge...

eth-bot
eth-bot previously approved these changes Jul 13, 2025
Copy link
Collaborator

@eth-bot eth-bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All Reviewers Have Approved; Performing Automatic Merge...

@github-actions github-actions bot added the w-ci Waiting on CI to pass label Jul 13, 2025
Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
auto-merge was automatically disabled July 13, 2025 19:16

Head branch was pushed to by a user without write access

@gballet gballet dismissed stale reviews from eth-bot and g11tech via 20e5895 July 13, 2025 19:16
Copy link

The commit 20e5895 (as a parent of 8ac290a) contains errors.
Please inspect the Run Summary for details.

Signed-off-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
@github-actions github-actions bot removed the w-ci Waiting on CI to pass label Jul 13, 2025
@eth-bot eth-bot enabled auto-merge (squash) July 13, 2025 20:06
Copy link
Collaborator

@eth-bot eth-bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All Reviewers Have Approved; Performing Automatic Merge...

@eth-bot eth-bot merged commit 8978724 into ethereum:master Jul 13, 2025
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
a-review Waiting on author to review c-status Changes a proposal's status s-draft This EIP is a Draft t-core
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants