Skip to content

implement EIP-8246 SELFDESTRUCT burn removal (amsterdam) #2766

Closed

Description

@gzliudan

Summary

EIP-8246 removes the SELFDESTRUCT burn: a contract that self-destructs to itself keeps its balance instead of burning it, and the state handling for accounts marked for destruction changes accordingly.

Why it is not implemented here

  • grep -rn 'EIP-8246\|8246' --include='*.go' returns nothing in this repository.
  • core/vm/instructions.go:919-965 still implements the pre-Amsterdam shape (self-destruct to self burns the balance) and core/state/statedb.go has no EIP-8246 path.

Upstream reference

go-ethereum master 7c5069001, checked 2026-10-21.

  • core/vm/instructions.go:947-965 (the burn is removed under Amsterdam).
  • core/state/statedb.go:875 (accounts marked for destruction), core/state/statedb_hooked.go:255 (the burn hook removed).

Upstream PRs

Role PR What it does
Prerequisite none ethereum#35218 was a draft that never merged; ethereum#35219 supersedes it. EIP-6780 (Cancun) is already here.
Main ethereum#35219 (2026-06-30) The implementation. It also deletes the EIP-7708 burn-log machinery (EthBurnLog, LogsForBurnAccounts, the vm.StateDB method).
Follow-up ethereum#35364 (2026-07-21) Extends core/eip8246_test.go by 154 lines, the behaviour reference for this port.
Follow-up ethereum#35759 (2026-09-21) Comment only: fixes the EIP number in the self-destruct comment (8264 -> 8246).
Consumer fix none upstream See below.

The consumer this EIP breaks has no upstream fix

Removing the burn changed what a self-destruct-to-self means, and the supply live tracer still counts it as a burn with no fork gate - eth/tracers/live/supply.go:240-242, if vm.OpCode(typ) == vm.SELFDESTRUCT && from == to && value.Cmp(common.Big0) == 1 { call.burn = value }. Upstream has not fixed it: the onEnter path is unconditional, and only the onBalanceChange path is gated by burnsBalance.

Here the matching fix is #2832 / #2833. That makes it a local fix ahead of upstream, not a port, and it must not be described later as "aligned with geth".

Scope

core/vm/instructions.go (SELFDESTRUCT), core/state (destruction and balance handling), plus consensus tests over self-destructing balances.

Dependencies

Interacts with EIP-7708 (transfer and burn logs): upstream notes that EIP-8246 removes the burn the EIP-7708 log would otherwise record, so the two should be decided and landed together.

Split out of #2730, the Amsterdam umbrella - this EIP is not mentioned there. Sibling per-EIP issues for the other unimplemented Amsterdam EIPs exist alongside this one.

Activity

  1. added
    enhancementNew feature or request
    and removed
    enhancementNew feature or request
    on Oct 9, 2026
  2. added 14 commits that reference this issue on Oct 20, 2026
    6d08fde
    d1d6fc6
    2b719b4
    4beef99
    31fe83a
    d299682
    88bcbff
    ee81b1a
    5be2dd5
    7b58a49
    defba4d
    d0d19de
    bb54996
    eae4c6a
  3. gzliudan commented on Oct 28, 2026

    @gzliudan
    CollaboratorAuthor

    Implemented by #2834, merged into dev-upgrade as eae4c6a7f4. Under Amsterdam opSelfdestruct preserves the balance instead of destroying it (core/vm/instructions.go:927) and the state layer reports no burn for it, so the EIP-8246 shape is in place end to end. Closing manually: #2834 targets dev-upgrade, not the default branch, so its Closes #2766 keyword did not take effect.

  4. changed the title [-]core/vm,core/state: implement EIP-8246 SELFDESTRUCT burn removal (amsterdam)[/-] [+]implement EIP-8246 SELFDESTRUCT burn removal (amsterdam)[/+] on Oct 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions