Skip to content

Commit

Permalink
Problem: EventConverter api shouldn't return multiple logs (#346)
Browse files Browse the repository at this point in the history
* Problem: EventConverter api shouldn't return multiple logs

* simplify

* clean
  • Loading branch information
yihuang authored Sep 12, 2023
1 parent 22a2152 commit 4750335
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 43 deletions.
10 changes: 5 additions & 5 deletions x/evm/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 {
Expand All @@ -120,16 +120,16 @@ func NewKeeper(
ss: ss,
customContracts: customContracts,
keys: keys,
eventConverters: eventConverters,
eventConverter: eventConverter,
}
}

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.
Expand Down
2 changes: 1 addition & 1 deletion x/evm/statedb/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 12 additions & 16 deletions x/evm/statedb/mock_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
}

Expand All @@ -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 {
Expand Down Expand Up @@ -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}
}
28 changes: 16 additions & 12 deletions x/evm/statedb/statedb.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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.
Expand Down Expand Up @@ -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.
Expand All @@ -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(),
}
}

Expand Down Expand Up @@ -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
}

Expand All @@ -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)
}
}
24 changes: 15 additions & 9 deletions x/evm/statedb/statedb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 &ethtypes.Log{Data: []byte("success1")}, nil
},
"success2": func(event sdk.Event) (*ethtypes.Log, error) {
return &ethtypes.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))

Expand Down

0 comments on commit 4750335

Please sign in to comment.