rpc: fix DecodeTx
(#227)
* fix decodeTx method * fix logic * fix singleswitchstatement lint error * refactor logic * add log * remove unecessary function Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>
This commit is contained in:
parent
735f00d4a3
commit
3a398d9237
@ -145,51 +145,54 @@ func (e *EVMBackend) EthBlockFromTendermint(
|
|||||||
ethRPCTxs := []interface{}{}
|
ethRPCTxs := []interface{}{}
|
||||||
|
|
||||||
for i, txBz := range block.Txs {
|
for i, txBz := range block.Txs {
|
||||||
tx, gas := types.DecodeTx(e.clientCtx, txBz)
|
tx, err := e.clientCtx.TxConfig.TxDecoder()(txBz)
|
||||||
|
if err != nil {
|
||||||
gasUsed += gas
|
e.logger.WithError(err).Warningln("failed to decode transaction in block at height ", block.Height)
|
||||||
|
|
||||||
msg, isEthTx := tx.(*evmtypes.MsgEthereumTx)
|
|
||||||
|
|
||||||
if !isEthTx {
|
|
||||||
// TODO: eventually support Cosmos txs in the block
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
hash := msg.AsTransaction().Hash()
|
for _, msg := range tx.GetMsgs() {
|
||||||
if !fullTx {
|
ethMsg, ok := msg.(*evmtypes.MsgEthereumTx)
|
||||||
ethRPCTxs = append(ethRPCTxs, hash)
|
|
||||||
continue
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Todo: gasUsed does not consider the refund gas so it is incorrect, we need to extract it from the result
|
||||||
|
gasUsed += ethMsg.GetGas()
|
||||||
|
hash := ethMsg.AsTransaction().Hash()
|
||||||
|
if !fullTx {
|
||||||
|
ethRPCTxs = append(ethRPCTxs, hash)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// get full transaction from message data
|
||||||
|
from, err := ethMsg.GetSender(e.chainID)
|
||||||
|
if err != nil {
|
||||||
|
e.logger.WithError(err).Warningln("failed to get sender from already included transaction ", hash)
|
||||||
|
from = common.HexToAddress(ethMsg.From)
|
||||||
|
}
|
||||||
|
|
||||||
|
txData, err := evmtypes.UnpackTxData(ethMsg.Data)
|
||||||
|
if err != nil {
|
||||||
|
e.logger.WithError(err).Debugln("decoding failed")
|
||||||
|
return nil, fmt.Errorf("failed to unpack tx data: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ethTx, err := types.NewTransactionFromData(
|
||||||
|
txData,
|
||||||
|
from,
|
||||||
|
hash,
|
||||||
|
common.BytesToHash(block.Hash()),
|
||||||
|
uint64(block.Height),
|
||||||
|
uint64(i),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
e.logger.WithError(err).Debugln("NewTransactionFromData for receipt failed", "hash", hash.Hex)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ethRPCTxs = append(ethRPCTxs, ethTx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get full transaction from message data
|
|
||||||
|
|
||||||
from, err := msg.GetSender(e.chainID)
|
|
||||||
if err != nil {
|
|
||||||
from = common.HexToAddress(msg.From)
|
|
||||||
}
|
|
||||||
|
|
||||||
txData, err := evmtypes.UnpackTxData(msg.Data)
|
|
||||||
if err != nil {
|
|
||||||
e.logger.WithError(err).Debugln("decoding failed")
|
|
||||||
return nil, fmt.Errorf("failed to unpack tx data: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ethTx, err := types.NewTransactionFromData(
|
|
||||||
txData,
|
|
||||||
from,
|
|
||||||
hash,
|
|
||||||
common.BytesToHash(block.Hash()),
|
|
||||||
uint64(block.Height),
|
|
||||||
uint64(i),
|
|
||||||
)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
e.logger.WithError(err).Debugln("NewTransactionFromData for receipt failed", "hash", hash.Hex)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
ethRPCTxs = append(ethRPCTxs, ethTx)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
blockBloomResp, err := queryClient.BlockBloom(types.ContextWithHeight(block.Height), &evmtypes.QueryBlockBloomRequest{})
|
blockBloomResp, err := queryClient.BlockBloom(types.ContextWithHeight(block.Height), &evmtypes.QueryBlockBloomRequest{})
|
||||||
|
@ -10,7 +10,6 @@ import (
|
|||||||
tmtypes "github.com/tendermint/tendermint/types"
|
tmtypes "github.com/tendermint/tendermint/types"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client"
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||||
|
|
||||||
evmtypes "github.com/tharsis/ethermint/x/evm/types"
|
evmtypes "github.com/tharsis/ethermint/x/evm/types"
|
||||||
@ -206,25 +205,6 @@ func FormatBlock(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func DecodeTx(clientCtx client.Context, txBz tmtypes.Tx) (sdk.Tx, uint64) {
|
|
||||||
var gasUsed uint64
|
|
||||||
txDecoder := clientCtx.TxConfig.TxDecoder()
|
|
||||||
|
|
||||||
tx, err := txDecoder(txBz)
|
|
||||||
if err != nil {
|
|
||||||
return nil, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
switch tx := tx.(type) {
|
|
||||||
case *evmtypes.MsgEthereumTx:
|
|
||||||
gasUsed = tx.GetGas() // NOTE: this doesn't include the gas refunded
|
|
||||||
case sdk.FeeTx:
|
|
||||||
gasUsed = tx.GetGas()
|
|
||||||
}
|
|
||||||
|
|
||||||
return tx, gasUsed
|
|
||||||
}
|
|
||||||
|
|
||||||
type DataError interface {
|
type DataError interface {
|
||||||
Error() string // returns the message
|
Error() string // returns the message
|
||||||
ErrorData() interface{} // returns the error data
|
ErrorData() interface{} // returns the error data
|
||||||
|
Loading…
Reference in New Issue
Block a user