evm, rpc: fix tx log attribute value is not parsable by some client (#615)
* Problem: tx log attribute value not parsable by some client Closes: #614 Solution: - encode the value to json string rather than bytes Apply suggestions from code review * rm cdc and changelog Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Federico Kunze <federico.kunze94@gmail.com>
This commit is contained in:
parent
d6423f0c3f
commit
cda968bddd
@ -53,6 +53,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
|||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
|
* (rpc, evm) [tharsis#614](https://github.com/tharsis/ethermint/issues/614) Use JSON for (un)marshaling tx `Log`s from events.
|
||||||
* (rpc) [tharsis#611](https://github.com/tharsis/ethermint/pull/611) Fix panic on JSON-RPC when querying for an invalid block height.
|
* (rpc) [tharsis#611](https://github.com/tharsis/ethermint/pull/611) Fix panic on JSON-RPC when querying for an invalid block height.
|
||||||
* (cmd) [tharsis#483](https://github.com/tharsis/ethermint/pull/483) Use config values on genesis accounts.
|
* (cmd) [tharsis#483](https://github.com/tharsis/ethermint/pull/483) Use config values on genesis accounts.
|
||||||
|
|
||||||
|
@ -400,7 +400,8 @@ func (e *EVMBackend) GetTransactionLogs(txHash common.Hash) ([]*ethtypes.Log, er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return TxLogsFromEvents(e.clientCtx.Codec, tx.TxResult.Events), nil
|
|
||||||
|
return TxLogsFromEvents(tx.TxResult.Events)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PendingTransactions returns the transactions that are in the transaction pool
|
// PendingTransactions returns the transactions that are in the transaction pool
|
||||||
@ -433,7 +434,11 @@ func (e *EVMBackend) GetLogsByHeight(height *int64) ([][]*ethtypes.Log, error) {
|
|||||||
|
|
||||||
blockLogs := [][]*ethtypes.Log{}
|
blockLogs := [][]*ethtypes.Log{}
|
||||||
for _, txResult := range blockRes.TxsResults {
|
for _, txResult := range blockRes.TxsResults {
|
||||||
logs := TxLogsFromEvents(e.clientCtx.Codec, txResult.Events)
|
logs, err := TxLogsFromEvents(txResult.Events)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
blockLogs = append(blockLogs, logs)
|
blockLogs = append(blockLogs, logs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,10 +2,10 @@ package backend
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
@ -135,21 +135,25 @@ func (e *EVMBackend) getAccountNonce(accAddr common.Address, pending bool, heigh
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TxLogsFromEvents parses ethereum logs from cosmos events
|
// TxLogsFromEvents parses ethereum logs from cosmos events
|
||||||
func TxLogsFromEvents(codec codec.Codec, events []abci.Event) []*ethtypes.Log {
|
func TxLogsFromEvents(events []abci.Event) ([]*ethtypes.Log, error) {
|
||||||
logs := make([]*evmtypes.Log, 0)
|
logs := make([]*evmtypes.Log, 0)
|
||||||
for _, event := range events {
|
for _, event := range events {
|
||||||
if event.Type != evmtypes.EventTypeTxLog {
|
if event.Type != evmtypes.EventTypeTxLog {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, attr := range event.Attributes {
|
for _, attr := range event.Attributes {
|
||||||
if !bytes.Equal(attr.Key, []byte(evmtypes.AttributeKeyTxLog)) {
|
if !bytes.Equal(attr.Key, []byte(evmtypes.AttributeKeyTxLog)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
var log evmtypes.Log
|
var log evmtypes.Log
|
||||||
codec.MustUnmarshal(attr.Value, &log)
|
if err := json.Unmarshal(attr.Value, &log); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
logs = append(logs, &log)
|
logs = append(logs, &log)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return evmtypes.LogsToEthereum(logs)
|
return evmtypes.LogsToEthereum(logs), nil
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package keeper
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/palantir/stacktrace"
|
"github.com/palantir/stacktrace"
|
||||||
@ -54,8 +55,11 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t
|
|||||||
|
|
||||||
txLogAttrs := make([]sdk.Attribute, 0)
|
txLogAttrs := make([]sdk.Attribute, 0)
|
||||||
for _, log := range response.Logs {
|
for _, log := range response.Logs {
|
||||||
bz := k.cdc.MustMarshal(log)
|
value, err := json.Marshal(log)
|
||||||
txLogAttrs = append(txLogAttrs, sdk.NewAttribute(types.AttributeKeyTxLog, string(bz)))
|
if err != nil {
|
||||||
|
return nil, stacktrace.Propagate(err, "failed to encode log")
|
||||||
|
}
|
||||||
|
txLogAttrs = append(txLogAttrs, sdk.NewAttribute(types.AttributeKeyTxLog, string(value)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// emit events
|
// emit events
|
||||||
|
Loading…
Reference in New Issue
Block a user