diff --git a/core/state/statedb_hooked.go b/core/state/statedb_hooked.go index 69e332cb09..8e37ceb02b 100644 --- a/core/state/statedb_hooked.go +++ b/core/state/statedb_hooked.go @@ -251,9 +251,13 @@ func (s *hookedStateDB) SelfDestruct6780(address common.Address) (uint256.Int, b prev, changed := s.inner.SelfDestruct6780(address) - if s.hooks.OnBalanceChange != nil && !prev.IsZero() { - s.hooks.OnBalanceChange(address, prev.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestruct) - } + /* + // TODO: figure out if this can be removed (it's redundant with the tracing invocations in core/vm/instructions.go already) + // it's also incorrect if the target/source are the same account + if s.hooks.OnBalanceChange != nil && !prev.IsZero() { + s.hooks.OnBalanceChange(address, prev.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestruct) + } + */ if changed && len(prevCode) > 0 { if s.hooks.OnCodeChangeV2 != nil { diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 44d3e81a9c..b700b86768 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -887,7 +887,9 @@ func opSelfdestruct(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) { } beneficiary := scope.Stack.pop() balance := evm.StateDB.GetBalance(scope.Contract.Address()) - evm.StateDB.AddBalance(beneficiary.Bytes20(), balance, tracing.BalanceIncreaseSelfdestruct) + if scope.Contract.Address() != common.BytesToAddress(beneficiary.Bytes()) { + evm.StateDB.AddBalance(beneficiary.Bytes20(), balance, tracing.BalanceIncreaseSelfdestruct) + } evm.StateDB.SelfDestruct(scope.Contract.Address()) if tracer := evm.Config.Tracer; tracer != nil { if tracer.OnEnter != nil { @@ -906,8 +908,11 @@ func opSelfdestruct6780(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, erro } beneficiary := scope.Stack.pop() balance := evm.StateDB.GetBalance(scope.Contract.Address()) - evm.StateDB.SubBalance(scope.Contract.Address(), balance, tracing.BalanceDecreaseSelfdestruct) - evm.StateDB.AddBalance(beneficiary.Bytes20(), balance, tracing.BalanceIncreaseSelfdestruct) + if scope.Contract.Address() != common.BytesToAddress(beneficiary.Bytes()) { + evm.StateDB.SubBalance(scope.Contract.Address(), balance, tracing.BalanceDecreaseSelfdestruct) + evm.StateDB.AddBalance(beneficiary.Bytes20(), balance, tracing.BalanceIncreaseSelfdestruct) + } + evm.StateDB.SelfDestruct6780(scope.Contract.Address()) if tracer := evm.Config.Tracer; tracer != nil { if tracer.OnEnter != nil {