Skip to content

Commit

Permalink
cmd/evm/internal/t8ntool,consensus/beacon,consensus/clique,consensus/…
Browse files Browse the repository at this point in the history
…ethash,core,core/txpool/blobpool,core/txpool,core/types,core/vm,eth/catalyst,eth/protocols/eth,miner,params/types/coregeth,params/types/ctypes,params/types/genesisT,params/types/goethereum: add conditions per block number for cancun EIPs
  • Loading branch information
ziogaschr committed Feb 8, 2024
1 parent 51c70ad commit de0e288
Show file tree
Hide file tree
Showing 22 changed files with 226 additions and 33 deletions.
3 changes: 2 additions & 1 deletion cmd/evm/internal/t8ntool/transition.go
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,8 @@ func applyMergeChecks(env *stEnv, chainConfig ctypes.ChainConfigurator) error {
}

func applyCancunChecks(env *stEnv, chainConfig ctypes.ChainConfigurator) error {
if !chainConfig.IsEnabledByTime(chainConfig.GetEIP4788TransitionTime, &env.Timestamp) {
eip4788Enabled := chainConfig.IsEnabledByTime(chainConfig.GetEIP4788TransitionTime, &env.Timestamp) || chainConfig.IsEnabled(chainConfig.GetEIP4788Transition, new(big.Int).SetUint64(env.Number))
if !eip4788Enabled {
env.ParentBeaconBlockRoot = nil // un-set it if it has been set too early
return nil
}
Expand Down
2 changes: 1 addition & 1 deletion consensus/beacon/consensus.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ func (beacon *Beacon) verifyHeader(chain consensus.ChainHeaderReader, header, pa
return fmt.Errorf("invalid withdrawalsHash: have %x, expected nil", header.WithdrawalsHash)
}
// Verify the existence / non-existence of excessDataGas
cancun := chain.Config().IsEnabledByTime(chain.Config().GetEIP4844TransitionTime, &header.Time)
cancun := chain.Config().IsEnabledByTime(chain.Config().GetEIP4844TransitionTime, &header.Time) || chain.Config().IsEnabled(chain.Config().GetEIP4844Transition, header.Number)
if !cancun {
switch {
case header.ExcessBlobGas != nil:
Expand Down
2 changes: 1 addition & 1 deletion consensus/clique/clique.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ func (c *Clique) verifyHeader(chain consensus.ChainHeaderReader, header *types.H
if chain.Config().IsEnabledByTime(chain.Config().GetEIP3855TransitionTime, &header.Time) || chain.Config().IsEnabled(chain.Config().GetEIP3855Transition, header.Number) {
return fmt.Errorf("clique does not support shanghai fork")
}
if chain.Config().IsEnabledByTime(chain.Config().GetEIP4844TransitionTime, &header.Time) {
if chain.Config().IsEnabledByTime(chain.Config().GetEIP4844TransitionTime, &header.Time) || chain.Config().IsEnabled(chain.Config().GetEIP4844Transition, header.Number) {
return fmt.Errorf("clique does not support cancun fork")
}
// All basic checks passed, verify cascading fields
Expand Down
4 changes: 2 additions & 2 deletions consensus/ethash/consensus.go
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainHeaderReader, header, pa
// Verify the header's EIP-1559 attributes.
return err
}
eip4844Enabled := chain.Config().IsEnabledByTime(chain.Config().GetEIP4844TransitionTime, &header.Time)
eip4844Enabled := chain.Config().IsEnabledByTime(chain.Config().GetEIP4844TransitionTime, &header.Time) || chain.Config().IsEnabled(chain.Config().GetEIP4844Transition, header.Number)
if !eip4844Enabled {
switch {
case header.ExcessBlobGas != nil:
Expand All @@ -292,7 +292,7 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainHeaderReader, header, pa
return err
}
}
eip4788Enabled := chain.Config().IsEnabledByTime(chain.Config().GetEIP4788TransitionTime, &header.Time)
eip4788Enabled := chain.Config().IsEnabledByTime(chain.Config().GetEIP4788TransitionTime, &header.Time) || chain.Config().IsEnabled(chain.Config().GetEIP4788Transition, header.Number)
if !eip4788Enabled {
if header.ParentBeaconRoot != nil {
return fmt.Errorf("invalid parentBeaconRoot, have %#x, expected nil", header.ParentBeaconRoot)
Expand Down
4 changes: 2 additions & 2 deletions core/chain_makers.go
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.S
header.GasLimit = CalcGasLimit(parentGasLimit, parentGasLimit)
}
}
if chain.Config().IsEnabledByTime(chain.Config().GetEIP4844TransitionTime, &header.Time) {
if chain.Config().IsEnabledByTime(chain.Config().GetEIP4844TransitionTime, &header.Time) || chain.Config().IsEnabled(chain.Config().GetEIP4844Transition, header.Number) {
var (
parentExcessBlobGas uint64
parentBlobGasUsed uint64
Expand All @@ -414,7 +414,7 @@ func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.S
header.ExcessBlobGas = &excessBlobGas
header.BlobGasUsed = new(uint64)
}
if chain.Config().IsEnabledByTime(chain.Config().GetEIP4788TransitionTime, &header.Time) {
if chain.Config().IsEnabledByTime(chain.Config().GetEIP4788TransitionTime, &header.Time) || chain.Config().IsEnabled(chain.Config().GetEIP4788Transition, header.Number) {
header.ParentBeaconRoot = new(common.Hash)
}
return header
Expand Down
4 changes: 2 additions & 2 deletions core/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ func GenesisToBlock(g *genesisT.Genesis, db ethdb.Database) *types.Block {
withdrawals = make([]*types.Withdrawal, 0)
}
// EIP4844 and EIP4788 are Cancun features.
isEIP4844 := conf.IsEnabledByTime(g.Config.GetEIP4844TransitionTime, &g.Timestamp)
isEIP4844 := conf.IsEnabledByTime(g.Config.GetEIP4844TransitionTime, &g.Timestamp) || conf.IsEnabled(conf.GetEIP4844Transition, new(big.Int).SetUint64(g.Number))
if isEIP4844 {
// EIP-4844 fields
head.ExcessBlobGas = g.ExcessBlobGas
Expand All @@ -463,7 +463,7 @@ func GenesisToBlock(g *genesisT.Genesis, db ethdb.Database) *types.Block {
head.BlobGasUsed = new(uint64)
}
}
isEIP4788 := conf.IsEnabledByTime(g.Config.GetEIP4788TransitionTime, &g.Timestamp)
isEIP4788 := conf.IsEnabledByTime(g.Config.GetEIP4788TransitionTime, &g.Timestamp) || conf.IsEnabled(g.Config.GetEIP4788Transition, new(big.Int).SetUint64(g.Number))
if isEIP4788 {
// EIP-4788: The parentBeaconBlockRoot of the genesis block is always
// the zero hash. This is because the genesis block does not have a parent
Expand Down
2 changes: 1 addition & 1 deletion core/state_processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ func GenerateBadBlock(parent *types.Block, engine consensus.Engine, txs types.Tr
nBlobs += len(tx.BlobHashes())
}
header.Root = common.BytesToHash(hasher.Sum(nil))
isEip4844 := config.IsEnabledByTime(config.GetEIP4844TransitionTime, &header.Time)
isEip4844 := config.IsEnabledByTime(config.GetEIP4844TransitionTime, &header.Time) || config.IsEnabled(config.GetEIP4844Transition, header.Number)
if isEip4844 {
var pExcess, pUsed = uint64(0), uint64(0)
if parent.ExcessBlobGas() != nil {
Expand Down
4 changes: 2 additions & 2 deletions core/state_transition.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ func (st *StateTransition) buyGas() error {
balanceCheck = balanceCheck.Mul(balanceCheck, st.msg.GasFeeCap)
balanceCheck.Add(balanceCheck, st.msg.Value)
}
if st.evm.ChainConfig().IsEnabledByTime(st.evm.ChainConfig().GetEIP4844TransitionTime, &st.evm.Context.Time) {
if st.evm.ChainConfig().IsEnabledByTime(st.evm.ChainConfig().GetEIP4844TransitionTime, &st.evm.Context.Time) || st.evm.ChainConfig().IsEnabled(st.evm.ChainConfig().GetEIP4844Transition, st.evm.Context.BlockNumber) {
if blobGas := st.blobGasUsed(); blobGas > 0 {
// Check that the user has enough funds to cover blobGasUsed * tx.BlobGasFeeCap
blobBalanceCheck := new(big.Int).SetUint64(blobGas)
Expand Down Expand Up @@ -325,7 +325,7 @@ func (st *StateTransition) preCheck() error {
}
}

if st.evm.ChainConfig().IsEnabledByTime(st.evm.ChainConfig().GetEIP4844TransitionTime, &st.evm.Context.Time) {
if st.evm.ChainConfig().IsEnabledByTime(st.evm.ChainConfig().GetEIP4844TransitionTime, &st.evm.Context.Time) || st.evm.ChainConfig().IsEnabled(st.evm.ChainConfig().GetEIP4844Transition, st.evm.Context.BlockNumber) {
if st.blobGasUsed() > 0 {
// Check that the user is paying at least the current blob fee
blobFee := st.evm.Context.BlobBaseFee
Expand Down
2 changes: 1 addition & 1 deletion core/txpool/blobpool/blobpool.go
Original file line number Diff line number Diff line change
Expand Up @@ -777,7 +777,7 @@ func (p *BlobPool) Reset(oldHead, newHead *types.Header) {
}
}
// Flush out any blobs from limbo that are older than the latest finality
isEIP4844 := p.chain.Config().IsEnabledByTime(p.chain.Config().GetEIP4844TransitionTime, &p.head.Time)
isEIP4844 := p.chain.Config().IsEnabledByTime(p.chain.Config().GetEIP4844TransitionTime, &p.head.Time) || p.chain.Config().IsEnabled(p.chain.Config().GetEIP4844Transition, p.head.Number)
if isEIP4844 {
p.limbo.finalize(p.chain.CurrentFinalBlock())
}
Expand Down
5 changes: 3 additions & 2 deletions core/txpool/blobpool/blobpool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,9 @@ func (bc *testBlockChain) CurrentBlock() *types.Header {
// mainnet ether existence, use that as a cap for the tests.
var (
blockNumber = new(big.Int).Add(new(big.Int).SetUint64(*bc.config.GetEIP1559Transition()), big.NewInt(1))
blockTime = *bc.config.GetEIP4844TransitionTime() + 1
gasLimit = uint64(30_000_000)
// TODO @ziogaschr: consider what to put here using the block number. We can leave it as is, as it's been using in tests only
blockTime = *bc.config.GetEIP4844TransitionTime() + 1
gasLimit = uint64(30_000_000)
)
lo := new(big.Int)
hi := new(big.Int).Mul(big.NewInt(5714), new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil))
Expand Down
3 changes: 2 additions & 1 deletion core/txpool/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ func ValidateTransaction(tx *types.Transaction, head *types.Header, signer types
if !opts.Config.IsEnabled(opts.Config.GetEIP1559Transition, head.Number) && tx.Type() == types.DynamicFeeTxType {
return fmt.Errorf("%w: type %d rejected, pool not yet in London", core.ErrTxTypeNotSupported, tx.Type())
}
if !opts.Config.IsEnabledByTime(opts.Config.GetEIP4844TransitionTime, &head.Time) && tx.Type() == types.BlobTxType {
eip4844Enabled := opts.Config.IsEnabledByTime(opts.Config.GetEIP4844TransitionTime, &head.Time) || opts.Config.IsEnabled(opts.Config.GetEIP4844Transition, head.Number)
if !eip4844Enabled && tx.Type() == types.BlobTxType {
return fmt.Errorf("%w: type %d rejected, pool not yet in Cancun", core.ErrTxTypeNotSupported, tx.Type())
}
// Check whether the init code size has been exceeded
Expand Down
4 changes: 2 additions & 2 deletions core/types/transaction_signing.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ type sigCache struct {
func MakeSigner(config ctypes.ChainConfigurator, blockNumber *big.Int, blockTime uint64) Signer {
var signer Signer
switch {
case config.IsEnabledByTime(config.GetEIP4844TransitionTime, &blockTime):
case config.IsEnabledByTime(config.GetEIP4844TransitionTime, &blockTime), config.IsEnabled(config.GetEIP4844Transition, blockNumber):
signer = NewCancunSigner(config.GetChainID())
case config.IsEnabled(config.GetEIP1559Transition, blockNumber):
signer = NewEIP1559Signer(config.GetChainID())
Expand All @@ -65,7 +65,7 @@ func MakeSigner(config ctypes.ChainConfigurator, blockNumber *big.Int, blockTime
// have the current block number available, use MakeSigner instead.
func LatestSigner(config ctypes.ChainConfigurator) Signer {
if chainID := config.GetChainID(); chainID != nil {
if config.GetEIP4844TransitionTime() != nil {
if config.GetEIP4844TransitionTime() != nil || config.GetEIP4844Transition() != nil {
return NewCancunSigner(chainID)
}
if config.GetEIP1559Transition() != nil {
Expand Down
2 changes: 1 addition & 1 deletion core/vm/contracts.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ func PrecompiledContractsForConfig(config ctypes.ChainConfigurator, bn *big.Int,
// 10-18 are BLS12-381 precompiles
mergeContracts(precompileds, PrecompiledContractsBLS)
}
if config.IsEnabledByTime(config.GetEIP4844TransitionTime, bt) {
if config.IsEnabledByTime(config.GetEIP4844TransitionTime, bt) || config.IsEnabled(config.GetEIP4844Transition, bn) {
precompileds[common.BytesToAddress([]byte{0x0a})] = &kzgPointEvaluation{}
}

Expand Down
10 changes: 5 additions & 5 deletions core/vm/jump_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,19 +222,19 @@ func instructionSetForConfig(config ctypes.ChainConfigurator, isPostMerge bool,
return validate(instructionSet)
}
*/
if config.IsEnabledByTime(config.GetEIP4844TransitionTime, bt) {
if config.IsEnabledByTime(config.GetEIP4844TransitionTime, bt) || config.IsEnabled(config.GetEIP4844Transition, bn) {
enable4844(instructionSet) // EIP-4844 (BLOBHASH opcode)
}
if config.IsEnabledByTime(config.GetEIP7516TransitionTime, bt) { // TODO(meowsbits): create EIP7516 configurator interface method
if config.IsEnabledByTime(config.GetEIP7516TransitionTime, bt) || config.IsEnabled(config.GetEIP7516Transition, bn) { // TODO(meowsbits): create EIP7516 configurator interface method
enable7516(instructionSet) // EIP-7516 (BLOBBASEFEE opcode)
}
if config.IsEnabledByTime(config.GetEIP1153TransitionTime, bt) {
if config.IsEnabledByTime(config.GetEIP1153TransitionTime, bt) || config.IsEnabled(config.GetEIP1153Transition, bn) {
enable1153(instructionSet) // EIP-1153 "Transient Storage"
}
if config.IsEnabledByTime(config.GetEIP5656TransitionTime, bt) {
if config.IsEnabledByTime(config.GetEIP5656TransitionTime, bt) || config.IsEnabled(config.GetEIP5656Transition, bn) {
enable5656(instructionSet) // EIP-5656 (MCOPY opcode)
}
if config.IsEnabledByTime(config.GetEIP6780TransitionTime, bt) {
if config.IsEnabledByTime(config.GetEIP6780TransitionTime, bt) || config.IsEnabled(config.GetEIP6780Transition, bn) {
enable6780(instructionSet) // EIP-6780 SELFDESTRUCT only in same transaction
}

Expand Down
12 changes: 7 additions & 5 deletions eth/catalyst/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,14 +218,14 @@ func (api *ConsensusAPI) verifyPayloadAttributes(attr *engine.PayloadAttributes)

// Verify withdrawals attribute for Shanghai.
withdrawalsCheck := func(b *big.Int, t uint64) bool {
return c.IsEnabledByTime(c.GetEIP4895TransitionTime, &t)
return c.IsEnabledByTime(c.GetEIP4895TransitionTime, &t) || c.IsEnabled(c.GetEIP4895Transition, b)
}
if err := checkAttribute(withdrawalsCheck, attr.Withdrawals != nil, eip1559BlockBig, attr.Timestamp); err != nil {
return fmt.Errorf("invalid withdrawals: %w", err)
}
// Verify beacon root attribute for Cancun.
beaconRootCheck := func(b *big.Int, t uint64) bool {
return c.IsEnabledByTime(c.GetEIP4788TransitionTime, &t) // TODO(meowsbits)
return c.IsEnabledByTime(c.GetEIP4788TransitionTime, &t) || c.IsEnabled(c.GetEIP4788Transition, b)
}
if err := checkAttribute(beaconRootCheck, attr.BeaconRoot != nil, eip1559BlockBig, attr.Timestamp); err != nil {
return fmt.Errorf("invalid parent beacon block root: %w", err)
Expand Down Expand Up @@ -481,7 +481,7 @@ func (api *ConsensusAPI) NewPayloadV2(params engine.ExecutableData) (engine.Payl
} else if params.Withdrawals != nil {
return engine.PayloadStatusV1{Status: engine.INVALID}, engine.InvalidParams.With(errors.New("non-nil withdrawals pre-shanghai"))
}
is4844 := api.eth.BlockChain().Config().IsEnabledByTime(api.eth.BlockChain().Config().GetEIP4844TransitionTime, &params.Timestamp)
is4844 := api.eth.BlockChain().Config().IsEnabledByTime(api.eth.BlockChain().Config().GetEIP4844TransitionTime, &params.Timestamp) || api.eth.BlockChain().Config().IsEnabled(api.eth.BlockChain().Config().GetEIP4844Transition, new(big.Int).SetUint64(params.Number))
if is4844 {
return engine.PayloadStatusV1{Status: engine.INVALID}, engine.InvalidParams.With(errors.New("newPayloadV2 called post-cancun"))
}
Expand All @@ -504,11 +504,13 @@ func (api *ConsensusAPI) NewPayloadV3(params engine.ExecutableData, versionedHas
}

// Since both 4844 (blob txes) and 4788 (beacon root) features are checked, we assert BOTH config values.
if !api.eth.BlockChain().Config().IsEnabledByTime(api.eth.BlockChain().Config().GetEIP4844TransitionTime, &params.Timestamp) {
eip4844Enabled := api.eth.BlockChain().Config().IsEnabledByTime(api.eth.BlockChain().Config().GetEIP4844TransitionTime, &params.Timestamp) || api.eth.BlockChain().Config().IsEnabled(api.eth.BlockChain().Config().GetEIP4844Transition, new(big.Int).SetUint64(params.Number))
if !eip4844Enabled {
return engine.PayloadStatusV1{Status: engine.INVALID}, engine.UnsupportedFork.With(errors.New("newPayloadV3 called pre-cancun"))
}

if !api.eth.BlockChain().Config().IsEnabledByTime(api.eth.BlockChain().Config().GetEIP4788TransitionTime, &params.Timestamp) {
eip4788Enabled := api.eth.BlockChain().Config().IsEnabledByTime(api.eth.BlockChain().Config().GetEIP4788TransitionTime, &params.Timestamp) || api.eth.BlockChain().Config().IsEnabled(api.eth.BlockChain().Config().GetEIP4788Transition, new(big.Int).SetUint64(params.Number))
if !eip4788Enabled {
return engine.PayloadStatusV1{Status: engine.INVALID}, engine.UnsupportedFork.With(errors.New("newPayloadV3 called pre-cancun"))
}

Expand Down
3 changes: 2 additions & 1 deletion eth/protocols/eth/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ func MakeProtocols(backend Backend, network uint64, protocolVersions []uint, dns

// TODO(meowsbits): FIXME re: Cancun config/time/enabled check
// Blob transactions require eth/68 announcements, disable everything else
if version <= ETH67 && backend.Chain().Config().GetEIP4844TransitionTime() != nil {
eip4844Enabled := backend.Chain().Config().GetEIP4844TransitionTime() != nil || backend.Chain().Config().GetEIP4844Transition() != nil
if version <= ETH67 && eip4844Enabled {
continue
}

Expand Down
6 changes: 3 additions & 3 deletions miner/worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -1087,9 +1087,9 @@ func (w *worker) prepareWork(genParams *generateParams) (*environment, error) {
}
}
// Apply EIP-4844.
if w.chainConfig.IsEnabledByTime(w.chainConfig.GetEIP4844TransitionTime, &header.Time) {
if w.chainConfig.IsEnabledByTime(w.chainConfig.GetEIP4844TransitionTime, &header.Time) || w.chainConfig.IsEnabled(w.chainConfig.GetEIP4844Transition, header.Number) {
var excessBlobGas uint64
if w.chainConfig.IsEnabledByTime(w.chainConfig.GetEIP4844TransitionTime, &parent.Time) {
if w.chainConfig.IsEnabledByTime(w.chainConfig.GetEIP4844TransitionTime, &parent.Time) || w.chainConfig.IsEnabled(w.chainConfig.GetEIP4844Transition, parent.Number) {
excessBlobGas = eip4844.CalcExcessBlobGas(*parent.ExcessBlobGas, *parent.BlobGasUsed)
} else {
// For the first post-fork block, both parent.data_gas_used and parent.excess_data_gas are evaluated as 0
Expand All @@ -1099,7 +1099,7 @@ func (w *worker) prepareWork(genParams *generateParams) (*environment, error) {
header.ExcessBlobGas = &excessBlobGas
}
// Apply EIP-4788.
if w.chainConfig.IsEnabledByTime(w.chainConfig.GetEIP4788TransitionTime, &header.Time) {
if w.chainConfig.IsEnabledByTime(w.chainConfig.GetEIP4788TransitionTime, &header.Time) || w.chainConfig.IsEnabled(w.chainConfig.GetEIP4788Transition, header.Number) {
header.ParentBeaconRoot = genParams.beaconRoot
}
// Run the consensus preparation with the default or customized consensus engine.
Expand Down
8 changes: 8 additions & 0 deletions params/types/coregeth/chain_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,14 @@ type CoreGethChainConfig struct {
EIP6780FTime *uint64 `json:"eip6780FTime,omitempty"` // EIP-6780: SELFDESTRUCT only in same transaction https://eips.ethereum.org/EIPS/eip-6780
EIP4788FTime *uint64 `json:"eip4788FTime,omitempty"` // EIP-4788: Beacon block root in the EVM https://eips.ethereum.org/EIPS/eip-4788

// Cancun with block activations
EIP4844FBlock *big.Int `json:"eip4844FBlock,omitempty"` // EIP-4844: Shard Blob Transactions https://eips.ethereum.org/EIPS/eip-4844
EIP7516FBlock *big.Int `json:"eip7516FBlock,omitempty"` // EIP-7516: Blob Base Fee Opcode https://eips.ethereum.org/EIPS/eip-7516
EIP1153FBlock *big.Int `json:"eip1153FBlock,omitempty"` // EIP-1153: Transient Storage opcodes https://eips.ethereum.org/EIPS/eip-1153
EIP5656FBlock *big.Int `json:"eip5656FBlock,omitempty"` // EIP-5656: MCOPY - Memory copying instruction https://eips.ethereum.org/EIPS/eip-5656
EIP6780FBlock *big.Int `json:"eip6780FBlock,omitempty"` // EIP-6780: SELFDESTRUCT only in same transaction https://eips.ethereum.org/EIPS/eip-6780
EIP4788FBlock *big.Int `json:"eip4788FBlock,omitempty"` // EIP-4788: Beacon block root in the EVM https://eips.ethereum.org/EIPS/eip-4788

MergeNetsplitVBlock *big.Int `json:"mergeNetsplitVBlock,omitempty"` // Virtual fork after The Merge to use as a network splitter

DisposalBlock *big.Int `json:"disposalBlock,omitempty"` // Bomb disposal HF block
Expand Down
Loading

0 comments on commit de0e288

Please sign in to comment.