diff --git a/app/eth_replay.go b/app/eth_replay.go index 5b3cf6197..21746b6de 100644 --- a/app/eth_replay.go +++ b/app/eth_replay.go @@ -90,6 +90,7 @@ func Replay(a *App) { a.Logger().Info(fmt.Sprintf("Verifying tx %s", tx.Hash().Hex())) if tx.To() != nil { a.EvmKeeper.VerifyBalance(ctx, *tx.To()) + a.EvmKeeper.VerifyState(ctx, *tx.To()) } a.EvmKeeper.VerifyTxResult(ctx, tx.Hash()) } diff --git a/x/evm/keeper/replay.go b/x/evm/keeper/replay.go index 1b2720e1a..c202b38ed 100644 --- a/x/evm/keeper/replay.go +++ b/x/evm/keeper/replay.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/sei-protocol/sei-chain/x/evm/types" ) func (k *Keeper) VerifyBalance(ctx sdk.Context, addr common.Address) { @@ -87,3 +88,19 @@ func (k *Keeper) VerifyAccount(ctx sdk.Context, addr common.Address, accountData panic(fmt.Sprintf("nonce mismatch for address %s: expected %d, got %d", addr.Hex(), nonce, k.GetNonce(ctx, addr))) } } + +func (k *Keeper) VerifyState(ctx sdk.Context, addr common.Address) { + store := k.PrefixStore(ctx, types.StateKey(addr)) + iter := store.Iterator(nil, nil) + defer iter.Close() + for ; iter.Valid(); iter.Next() { + key := common.BytesToHash(iter.Key()) + ethVal, err := k.EthClient.StorageAt(ctx.Context(), addr, key, k.ReplayBlock.Number()) + if err != nil { + panic(err) + } + if !bytes.Equal(iter.Value(), ethVal) { + panic(fmt.Sprintf("state mismatch for address %s hash %s: expected %X but got %X", addr.Hex(), key.Hex(), ethVal, iter.Value())) + } + } +} diff --git a/x/evm/module.go b/x/evm/module.go index 5fd7810e8..16490ef5e 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "math" - "math/big" // this line is used by starport scaffolding # 1 @@ -213,11 +212,7 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val } coinbase = am.keeper.GetSeiAddressOrDefault(ctx, block.BlockHeader.Coinbase) } else if am.keeper.EthReplayConfig.Enabled { - block, err := am.keeper.EthClient.BlockByNumber(ctx.Context(), big.NewInt(ctx.BlockHeight()+am.keeper.GetReplayInitialHeight(ctx))) - if err != nil { - panic(fmt.Sprintf("error getting block at height %d", ctx.BlockHeight()+am.keeper.GetReplayInitialHeight(ctx))) - } - coinbase = am.keeper.GetSeiAddressOrDefault(ctx, block.Header_.Coinbase) + coinbase = am.keeper.GetSeiAddressOrDefault(ctx, am.keeper.ReplayBlock.Header_.Coinbase) am.keeper.SetReplayedHeight(ctx) } else { coinbase = am.keeper.AccountKeeper().GetModuleAddress(authtypes.FeeCollectorName)