Skip to content

Bectra Hardfork

Bectra is Berachain's EVM Pectra upgrade, which introduces a variety of changes, including major updates:

  1. Validators can withdraw all or part of their $BERA stake.
  2. All users can take advantage of EIP 7702 which enables any EOA to set its code based on any existing smart contract.
  3. There are [additional EIPs enabled]/beacon-kit/changelog#v1-2-0-bectra-hardfork-bera-prague-electra) with this fork.

WARNING

All users, whether hosting an RPC or running a validator, must upgrade their Execution Client and Consensus Client to continue following the chain.

Hardfork Upgrade Timeline

DateMilestone
April 30, 2025Beacon-Kit 1.2.0-rc released for Bepolia
May 7, 2025 @ 12pm EDTBectra Hardfork Live on Bepolia
May 28, 2025Beacon-Kit 1.2.0 released for Mainnet
June 2, 2025All infrastructure partners expected to be upgraded
June 4, 2025 @ 1pm EDTBectra Hardfork Live on Berachain Mainnet

Execution Client Upgrade

The first upgrade is for the Execution Client, which enables new operations at the designated fork activation time. The following execution client versions have been tested / are recommended:

ClientVersion
Geth1.15.10 or .11
Reth1.3.12
Nethermind1.31.x
Besu25.4.1
Erigon3.0.x

Step 1 - Deploy Genesis File

Use the updated execution client genesis files to ensure your node is compatible with Bectra, and place them in their respective locations based on the execution client you are using:

Reth, Geth, Besu, Erigon

bash
wget https://raw.githubusercontent.com/berachain/beacon-kit/refs/tags/v1.2.0/testing/networks/80094/eth-genesis.json;
md5 eth-genesis.json;

# [Expected Exact Output]:
# 77bc26d81f1c8c16070d3b641428901f

cp eth-genesis.json var/reth/genesis.json

The reth, besu, Erigon, and Nethermind clients automatically load and apply the new genesis file.

Geth Additional Steps

For geth you must run geth init again after the genesis file has been placed in the correct directory. We recommend this be made a permanent part of every geth startup. Our recommended startup process now includes this.

TIP

If your node is an archive node and ordinarily runs with --state.scheme hash, then you must provide that option to geth init as well.

bash
geth init --datadir /path/to/geth/data /path/to/eth-genesis.json;

The geth datadir should contain the following directories:

bash
tree datadir;

# [Expected Output]:
# datadir
# ├── keystore
# └── geth
#     ├── blobpool
#     └── chaindata

Example Successful Geth Bectra Upgrade:

bash
$ geth version
Geth
Version: 1.15.11-stable
Git Commit: 36b2371c59cd91a9b1da062b3e382f05a6d8687e
Git Commit Date: 20250505
Architecture: amd64
Go Version: go1.24.2
Operating System: linux
GOPATH=
GOROOT=

$ ./fetch-berachain-params.sh
0038db129d91238c9bff8e495c5fa93f  seed-data-80094/app.toml
8e5601f00d14d3694b4eccc8c101b15b  seed-data-80094/config.toml
5aeab3cb885d8f32892685fc8e44151b  seed-data-80094/el-bootnodes.txt
b00257ebcaa13f02559861696b55c5da  seed-data-80094/el-peers.txt
77bc26d81f1c8c16070d3b641428901f  seed-data-80094/eth-genesis.json
2deeecfe9ac40d6a8cced45cca3bf0bc  seed-data-80094/eth-nether-genesis.json
c66dbea5ee3889e1d0a11f856f1ab9f0  seed-data-80094/genesis.json
5d0d482758117af8dfc20e1d52c31eef  seed-data-80094/kzg-trusted-setup.json

$ geth init --datadir var/geth/data seed-data-80094/eth-genesis.json
INFO [05-27|17:37:00.791] Maximum peer count                       ETH=50 total=50
INFO [05-27|17:37:00.793] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [05-27|17:37:00.795] Set global gas cap                       cap=50,000,000
INFO [05-27|17:37:00.795] Initializing the KZG library             backend=gokzg
INFO [05-27|17:37:00.798] Using pebble as the backing database
INFO [05-27|17:37:00.798] Allocated cache and file handles         database=/opt/berachain/geth-mainnet/var/geth/data/geth/chaindata cache=16.00MiB handles=16
INFO [05-27|17:37:01.166] Opened ancient database                  database=/opt/berachain/geth-mainnet/var/geth/data/geth/chaindata/ancient/chain readonly=false
INFO [05-27|17:37:01.168] State scheme set to already existing     scheme=hash
INFO [05-27|17:37:07.758] Successfully wrote genesis state         database=chaindata hash=d57819..fcfb38

Note: hash=d57819..fcfb38 must be seen!

Nethermind

bash
wget https://raw.githubusercontent.com/berachain/beacon-kit/refs/tags/v1.2.0/testing/networks/80094/eth-nether-genesis.json;
md5 eth-nether-genesis.json;

# [Expected Exact Output]:
# 2deeecfe9ac40d6a8cced45cca3bf0bc

Step 2 - Verify EL Upgrade

Start the execution client and check the logs for indications of successful fork activation.

bash
# [ EXAMPLE for geth - expected similar output for other EL]
# Post-Merge hard forks (timestamp based):
# - Shanghai:                    @0
# - Cancun:                      @0
# - Prague:                      @1749056400

Beacon Kit Upgrade

Beacon Kit 1.2.0 is required in addition to the execution client configuration for the Bectra Hardfork.

Step 1 - Configure app.toml

Revise your app.toml by adding this configuration to the beacon-kit section. Create the section if it doesn't exist:

File: ./.beacond/config/app.toml

toml
[beacon-kit]

chain-spec = "mainnet"     # or testnet, as case may be

Step 2 - Verify CL Upgrade

Start beacond and verify that the following is logged. Note the "Electra Fork Time" in the banner.

bash
./beacond start; # Use --home as needed;

# [Expected Output]:

	+==========================================================================+
	+ ⭐️ Star BeaconKit on GitHub @ https://github.com/berachain/beacon-kit    +
	+ 🧩 Your node is running version: v1.2.0                                  +
	+ 💾 Your system: linux/amd64                                              +
	+ 🍴 Deneb1 Fork Time: 1738415507                                          +
	+ 🍴 Electra Fork Time: 1749056400                                         +
	+ 🦺 Please report issues @ https://github.com/berachain/beacon-kit/issues +
	+==========================================================================+