From 3c7336b0e9cb88a633eeae3b219407786b520414 Mon Sep 17 00:00:00 2001 From: Karol Chojnowski Date: Fri, 8 Nov 2024 15:25:30 +0100 Subject: [PATCH] core/state: invoke OnCodeChange-hook on selfdestruct (#30686) This change invokes the OnCodeChange hook when selfdestruct operation is performed, and a contract is removed. This is an event which can be consumed by tracers. --- core/state/statedb_hooked.go | 40 ++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/core/state/statedb_hooked.go b/core/state/statedb_hooked.go index 3abb0fa65f..26d0217099 100644 --- a/core/state/statedb_hooked.go +++ b/core/state/statedb_hooked.go @@ -198,22 +198,46 @@ func (s *hookedStateDB) SetState(address common.Address, key common.Hash, value } func (s *hookedStateDB) SelfDestruct(address common.Address) uint256.Int { + var prevCode []byte + var prevCodeHash common.Hash + + if s.hooks.OnCodeChange != nil { + prevCode = s.inner.GetCode(address) + prevCodeHash = s.inner.GetCodeHash(address) + } + prev := s.inner.SelfDestruct(address) - if !prev.IsZero() { - if s.hooks.OnBalanceChange != nil { - s.hooks.OnBalanceChange(address, prev.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestruct) - } + + if s.hooks.OnBalanceChange != nil && !prev.IsZero() { + s.hooks.OnBalanceChange(address, prev.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestruct) + } + + if s.hooks.OnCodeChange != nil && len(prevCode) > 0 { + s.hooks.OnCodeChange(address, prevCodeHash, prevCode, types.EmptyCodeHash, nil) } + return prev } func (s *hookedStateDB) SelfDestruct6780(address common.Address) (uint256.Int, bool) { + var prevCode []byte + var prevCodeHash common.Hash + + if s.hooks.OnCodeChange != nil { + prevCodeHash = s.inner.GetCodeHash(address) + prevCode = s.inner.GetCode(address) + } + prev, changed := s.inner.SelfDestruct6780(address) - if !prev.IsZero() && changed { - if s.hooks.OnBalanceChange != nil { - s.hooks.OnBalanceChange(address, prev.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestruct) - } + + if s.hooks.OnBalanceChange != nil && changed && !prev.IsZero() { + s.hooks.OnBalanceChange(address, prev.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestruct) + } + + if s.hooks.OnCodeChange != nil && changed && len(prevCode) > 0 { + s.hooks.OnCodeChange(address, prevCodeHash, prevCode, types.EmptyCodeHash, nil) } + return prev, changed }