diff --git a/CHANGELOG.md b/CHANGELOG.md index ad9969a5fe..38e2fb44d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (rpc) [#536](https://github.com/crypto-org-chain/ethermint/pull/536) Fix validate basic after transaction conversion with raw field. * (cli) [#537](https://github.com/crypto-org-chain/ethermint/pull/537) Fix unsuppored sign mode SIGN_MODE_TEXTUAL for bank transfer. * (cli) [#543](https://github.com/crypto-org-chain/ethermint/pull/543) Fix graceful shutdown. +* (rpc) [#545](https://github.com/crypto-org-chain/ethermint/pull/545) Fix state overwrite in debug trace APIs. ### Improvements diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index f5675d60a2..3b4906246e 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -328,7 +328,11 @@ func (k *Keeper) ApplyMessageWithConfig( tracer := cfg.GetTracer() if tracer != nil { if cfg.DebugTrace { - stateDB.SubBalance(sender.Address(), new(big.Int).Mul(msg.GasPrice, new(big.Int).SetUint64(msg.GasLimit))) + amount := new(big.Int).Mul(msg.GasPrice, new(big.Int).SetUint64(msg.GasLimit)) + stateDB.SubBalance(sender.Address(), amount) + if err := stateDB.Error(); err != nil { + return nil, err + } stateDB.SetNonce(sender.Address(), stateDB.GetNonce(sender.Address())+1) } tracer.CaptureTxStart(leftoverGas) diff --git a/x/evm/keeper/statedb.go b/x/evm/keeper/statedb.go index e4e6f0d9ae..e718de0148 100644 --- a/x/evm/keeper/statedb.go +++ b/x/evm/keeper/statedb.go @@ -138,20 +138,6 @@ func (k *Keeper) SetAccount(ctx sdk.Context, addr common.Address, account stated return nil } -func (k *Keeper) incrNonce(ctx sdk.Context, addr sdk.AccAddress) error { - acct := k.accountKeeper.GetAccount(ctx, addr) - if acct == nil { - acct = k.accountKeeper.NewAccountWithAddress(ctx, addr) - } - - if err := acct.SetSequence(acct.GetSequence() + 1); err != nil { - return err - } - - k.accountKeeper.SetAccount(ctx, acct) - return nil -} - // SetState update contract storage, delete if value is empty. func (k *Keeper) SetState(ctx sdk.Context, addr common.Address, key common.Hash, value []byte) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.AddressStoragePrefix(addr)) diff --git a/x/evm/statedb/statedb.go b/x/evm/statedb/statedb.go index b5f3caf027..ab4f7ac414 100644 --- a/x/evm/statedb/statedb.go +++ b/x/evm/statedb/statedb.go @@ -637,6 +637,10 @@ func (s *StateDB) RevertToSnapshot(revid int) { s.validRevisions = s.validRevisions[:idx] } +func (s *StateDB) Error() error { + return s.err +} + // Commit writes the dirty states to keeper // the StateDB object should be discarded after committed. func (s *StateDB) Commit() error {