diff --git a/core/state/state_object.go b/core/state/state_object.go index 8b9748a4df73..9adc7f37fcbf 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -459,7 +459,7 @@ func (s *stateObject) AddBalance(amount *uint256.Int) uint256.Int { return s.SetBalance(new(uint256.Int).Add(s.Balance(), amount)) } -// SetBalance sets the balance for the object, and returns the prevous balance +// SetBalance sets the balance for the object, and returns the previous balance. func (s *stateObject) SetBalance(amount *uint256.Int) uint256.Int { prev := *s.data.Balance s.db.journal.balanceChange(s.address, s.data.Balance) diff --git a/core/state/statedb.go b/core/state/statedb.go index 51adee555308..1fe15d9a875a 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -402,24 +402,22 @@ func (s *StateDB) HasSelfDestructed(addr common.Address) bool { // AddBalance adds amount to the account associated with addr. func (s *StateDB) AddBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int { stateObject := s.getOrNewStateObject(addr) - if stateObject != nil { - return stateObject.AddBalance(amount) + if stateObject == nil { + return uint256.Int{} } - return uint256.Int{} + return stateObject.AddBalance(amount) } // SubBalance subtracts amount from the account associated with addr. func (s *StateDB) SubBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int { stateObject := s.getOrNewStateObject(addr) - var prev uint256.Int - if amount.IsZero() { - return prev + if stateObject == nil { + return uint256.Int{} } - if stateObject != nil { - prev = *(stateObject.Balance()) - stateObject.SetBalance(new(uint256.Int).Sub(stateObject.Balance(), amount)) + if amount.IsZero() { + return *(stateObject.Balance()) } - return prev + return stateObject.SetBalance(new(uint256.Int).Sub(stateObject.Balance(), amount)) } func (s *StateDB) SetBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) { @@ -505,15 +503,15 @@ func (s *StateDB) SelfDestruct(addr common.Address) uint256.Int { return prevBalance } -func (s *StateDB) Selfdestruct6780(addr common.Address) uint256.Int { +func (s *StateDB) Selfdestruct6780(addr common.Address) (uint256.Int, bool) { stateObject := s.getStateObject(addr) if stateObject == nil { - return uint256.Int{} + return uint256.Int{}, false } if stateObject.newContract { - return s.SelfDestruct(addr) + return s.SelfDestruct(addr), true } - return *(stateObject.Balance()) + return *(stateObject.Balance()), false } // SetTransientState sets transient storage for a given account. It diff --git a/core/state/statedb_hooked.go b/core/state/statedb_hooked.go index 36047352a6ea..13869ba4f50f 100644 --- a/core/state/statedb_hooked.go +++ b/core/state/statedb_hooked.go @@ -159,7 +159,7 @@ func (s *hookedStateDB) Witness() *stateless.Witness { func (s *hookedStateDB) SubBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int { prev := s.inner.SubBalance(addr, amount, reason) - if s.hooks.OnBalanceChange != nil { + if s.hooks.OnBalanceChange != nil && !amount.IsZero() { newBalance := new(uint256.Int).Sub(&prev, amount) s.hooks.OnBalanceChange(addr, prev.ToBig(), newBalance.ToBig(), reason) } @@ -168,7 +168,7 @@ func (s *hookedStateDB) SubBalance(addr common.Address, amount *uint256.Int, rea func (s *hookedStateDB) AddBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int { prev := s.inner.AddBalance(addr, amount, reason) - if s.hooks.OnBalanceChange != nil { + if s.hooks.OnBalanceChange != nil && !amount.IsZero() { newBalance := new(uint256.Int).Add(&prev, amount) s.hooks.OnBalanceChange(addr, prev.ToBig(), newBalance.ToBig(), reason) } @@ -207,14 +207,14 @@ func (s *hookedStateDB) SelfDestruct(address common.Address) uint256.Int { return prev } -func (s *hookedStateDB) Selfdestruct6780(address common.Address) uint256.Int { - prev := s.inner.Selfdestruct6780(address) - if !prev.IsZero() { +func (s *hookedStateDB) Selfdestruct6780(address common.Address) (uint256.Int, bool) { + 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) } } - return prev + return prev, changed } func (s *hookedStateDB) AddLog(log *types.Log) { diff --git a/core/vm/interface.go b/core/vm/interface.go index 6f88b84c0aa8..9f582033923d 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -60,7 +60,7 @@ type StateDB interface { SelfDestruct(common.Address) uint256.Int HasSelfDestructed(common.Address) bool - Selfdestruct6780(common.Address) uint256.Int + Selfdestruct6780(common.Address) (uint256.Int, bool) // Exist reports whether the given account exists in state. // Notably this should also return true for self-destructed accounts.