diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 4a46271aad..25a92768aa 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -78,7 +78,7 @@ type Keeper struct { // or ideally just pass the application's all stores. keys map[string]storetypes.StoreKey - eventConverters map[string]statedb.EventConverter + eventConverter statedb.EventConverter } // NewKeeper generates new evm module keeper @@ -94,7 +94,7 @@ func NewKeeper( ss paramstypes.Subspace, customContracts []precompiles.StatefulPrecompiledContract, keys map[string]storetypes.StoreKey, - eventConverters map[string]statedb.EventConverter, + eventConverter statedb.EventConverter, ) *Keeper { // ensure evm module account is set if addr := ak.GetModuleAddress(types.ModuleName); addr == nil { @@ -120,7 +120,7 @@ func NewKeeper( ss: ss, customContracts: customContracts, keys: keys, - eventConverters: eventConverters, + eventConverter: eventConverter, } } @@ -128,8 +128,8 @@ func (k Keeper) StoreKeys() map[string]storetypes.StoreKey { return k.keys } -func (k Keeper) EventConverters() map[string]statedb.EventConverter { - return k.eventConverters +func (k Keeper) EventConverter() statedb.EventConverter { + return k.eventConverter } // Logger returns a module-specific logger. diff --git a/x/evm/statedb/interfaces.go b/x/evm/statedb/interfaces.go index acc615c029..6cec29803b 100644 --- a/x/evm/statedb/interfaces.go +++ b/x/evm/statedb/interfaces.go @@ -26,7 +26,7 @@ type Keeper interface { // for cache store wrapping StoreKeys() map[string]storetypes.StoreKey // for precompile native event conversion - EventConverters() map[string]EventConverter + EventConverter() EventConverter // Read methods GetAccount(ctx sdk.Context, addr common.Address) *Account diff --git a/x/evm/statedb/mock_test.go b/x/evm/statedb/mock_test.go index 89fb068adf..b051011bd3 100644 --- a/x/evm/statedb/mock_test.go +++ b/x/evm/statedb/mock_test.go @@ -24,18 +24,18 @@ type MockAcount struct { } type MockKeeper struct { - accounts map[common.Address]MockAcount - codes map[common.Hash][]byte - keys map[string]storetypes.StoreKey - eventConverters map[string]statedb.EventConverter + accounts map[common.Address]MockAcount + codes map[common.Hash][]byte + keys map[string]storetypes.StoreKey + eventConverter statedb.EventConverter } -func NewMockKeeperWith(keys map[string]storetypes.StoreKey, eventConverters map[string]statedb.EventConverter) *MockKeeper { +func NewMockKeeperWith(keys map[string]storetypes.StoreKey, eventConverter statedb.EventConverter) *MockKeeper { return &MockKeeper{ - accounts: make(map[common.Address]MockAcount), - codes: make(map[common.Hash][]byte), - keys: keys, - eventConverters: eventConverters, + accounts: make(map[common.Address]MockAcount), + codes: make(map[common.Hash][]byte), + keys: keys, + eventConverter: eventConverter, } } @@ -47,8 +47,8 @@ func (k MockKeeper) StoreKeys() map[string]storetypes.StoreKey { return k.keys } -func (k MockKeeper) EventConverters() map[string]statedb.EventConverter { - return k.eventConverters +func (k MockKeeper) EventConverter() statedb.EventConverter { + return k.eventConverter } func (k MockKeeper) GetAccount(ctx sdk.Context, addr common.Address) *statedb.Account { @@ -131,9 +131,5 @@ func (k MockKeeper) Clone() *MockKeeper { for k, v := range k.keys { keys[k] = v } - eventConverters := make(map[string]statedb.EventConverter, len(k.eventConverters)) - for k, v := range k.eventConverters { - eventConverters[k] = v - } - return &MockKeeper{accounts, codes, keys, eventConverters} + return &MockKeeper{accounts, codes, keys, k.eventConverter} } diff --git a/x/evm/statedb/statedb.go b/x/evm/statedb/statedb.go index 3e0c5fbaed..78ba71b270 100644 --- a/x/evm/statedb/statedb.go +++ b/x/evm/statedb/statedb.go @@ -21,7 +21,6 @@ import ( "sort" errorsmod "cosmossdk.io/errors" - abci "github.com/cometbft/cometbft/abci/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -31,7 +30,7 @@ import ( "github.com/evmos/ethermint/store/cachemulti" ) -type EventConverter = func([]abci.EventAttribute) []*ethtypes.Log +type EventConverter = func(sdk.Event) (*ethtypes.Log, error) // revision is the identifier of a version of state. // it consists of an auto-increment id and a journal index. @@ -75,8 +74,8 @@ type StateDB struct { // events emitted by native action nativeEvents sdk.Events - // eventConverters converts nativeEvents to ethereum logs - eventConverters map[string]EventConverter + // eventConverter converts nativeEvents to ethereum logs + eventConverter EventConverter } // New creates a new state from a given trie. @@ -92,8 +91,8 @@ func New(ctx sdk.Context, keeper Keeper, txConfig TxConfig) *StateDB { txConfig: txConfig, - nativeEvents: sdk.Events{}, - eventConverters: keeper.EventConverters(), + nativeEvents: sdk.Events{}, + eventConverter: keeper.EventConverter(), } } @@ -537,7 +536,7 @@ func (s *StateDB) Commit() error { } func (s *StateDB) convertNativeEvents(events []sdk.Event, contract common.Address) { - if len(s.eventConverters) == 0 { + if s.eventConverter == nil { return } @@ -546,11 +545,16 @@ func (s *StateDB) convertNativeEvents(events []sdk.Event, contract common.Addres } for _, event := range events { - if converter, ok := s.eventConverters[event.Type]; ok { - for _, log := range converter(event.Attributes) { - log.Address = contract - s.AddLog(log) - } + log, err := s.eventConverter(event) + if err != nil { + s.ctx.Logger().Error("failed to convert event", "err", err) + continue + } + if log == nil { + continue } + + log.Address = contract + s.AddLog(log) } } diff --git a/x/evm/statedb/statedb_test.go b/x/evm/statedb/statedb_test.go index 120a464bfa..a1f3014e1a 100644 --- a/x/evm/statedb/statedb_test.go +++ b/x/evm/statedb/statedb_test.go @@ -6,7 +6,6 @@ import ( "testing" dbm "github.com/cometbft/cometbft-db" - abci "github.com/cometbft/cometbft/abci/types" "github.com/cometbft/cometbft/libs/log" tmproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/store/rootmulti" @@ -585,16 +584,23 @@ func (suite *StateDBTestSuite) TestNativeAction() { suite.Require().NoError(ms.LoadLatestVersion()) ctx := sdk.NewContext(ms, tmproto.Header{}, false, log.NewNopLogger()) - eventConverters := map[string]statedb.EventConverter{ - "success1": func(attrs []abci.EventAttribute) []*ethtypes.Log { - return []*ethtypes.Log{{Data: []byte("success1")}} - }, - "success2": func(attrs []abci.EventAttribute) []*ethtypes.Log { - return []*ethtypes.Log{{Data: []byte("success2")}} - }, + eventConverter := func(event sdk.Event) (*ethtypes.Log, error) { + converters := map[string]statedb.EventConverter{ + "success1": func(event sdk.Event) (*ethtypes.Log, error) { + return ðtypes.Log{Data: []byte("success1")}, nil + }, + "success2": func(event sdk.Event) (*ethtypes.Log, error) { + return ðtypes.Log{Data: []byte("success2")}, nil + }, + } + converter, ok := converters[event.Type] + if !ok { + return nil, nil + } + return converter(event) } - keeper := NewMockKeeperWith(keys, eventConverters) + keeper := NewMockKeeperWith(keys, eventConverter) stateDB := statedb.New(ctx, keeper, emptyTxConfig) contract := common.BigToAddress(big.NewInt(101))