evm: treat all vm errors the same as reverted (#276)

Closes: #274

evm: fix `ExtraEIP` activation (#288)

Closes: #287

Update x/evm/types/utils.go

Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>

Add `Failed` utility function and changelog
This commit is contained in:
yihuang 2021-07-15 14:01:05 +08:00 committed by GitHub
parent 9d1ce30ecd
commit 297a35dbdd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 416 additions and 201 deletions

View File

@ -44,6 +44,8 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (rpc, evm) [tharsis#81](https://github.com/tharsis/ethermint/pull/81) Remove tx `Receipt` from store and replace it with fields obtained from the Tendermint RPC client. * (rpc, evm) [tharsis#81](https://github.com/tharsis/ethermint/pull/81) Remove tx `Receipt` from store and replace it with fields obtained from the Tendermint RPC client.
* (evm) [tharsis#72](https://github.com/tharsis/ethermint/issues/72) Update `AccessList` to use `TransientStore` instead of map. * (evm) [tharsis#72](https://github.com/tharsis/ethermint/issues/72) Update `AccessList` to use `TransientStore` instead of map.
* (evm) [tharsis#68](https://github.com/tharsis/ethermint/issues/68) Replace block hash storage map to use staking `HistoricalInfo`. * (evm) [tharsis#68](https://github.com/tharsis/ethermint/issues/68) Replace block hash storage map to use staking `HistoricalInfo`.
* (evm) [tharsis#276](https://github.com/tharsis/ethermint/pull/276) Vm errors don't result in cosmos tx failure, just
different tx state and events.
### API Breaking ### API Breaking

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -433,7 +433,7 @@ MsgEthereumTxResponse defines the Msg/EthereumTx response type.
| `hash` | [string](#string) | | ethereum transaction hash in hex format. This hash differs from the Tendermint sha256 hash of the transaction bytes. See https://github.com/tendermint/tendermint/issues/6539 for reference | | `hash` | [string](#string) | | ethereum transaction hash in hex format. This hash differs from the Tendermint sha256 hash of the transaction bytes. See https://github.com/tendermint/tendermint/issues/6539 for reference |
| `logs` | [Log](#ethermint.evm.v1alpha1.Log) | repeated | logs contains the transaction hash and the proto-compatible ethereum logs. | | `logs` | [Log](#ethermint.evm.v1alpha1.Log) | repeated | logs contains the transaction hash and the proto-compatible ethereum logs. |
| `ret` | [bytes](#bytes) | | returned data from evm function (result or data supplied with revert opcode) | | `ret` | [bytes](#bytes) | | returned data from evm function (result or data supplied with revert opcode) |
| `reverted` | [bool](#bool) | | reverted flag is set to true when the call has been reverted | | `vm_error` | [string](#string) | | vm error is the error returned by vm execution |
| `gas_used` | [uint64](#uint64) | | gas consumed by the transaction | | `gas_used` | [uint64](#uint64) | | gas consumed by the transaction |

View File

@ -26,6 +26,7 @@ import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
ethtypes "github.com/ethereum/go-ethereum/core/types" ethtypes "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/tharsis/ethermint/crypto/hd" "github.com/tharsis/ethermint/crypto/hd"
@ -525,10 +526,6 @@ func (e *PublicAPI) Call(args evmtypes.CallArgs, blockNr rpctypes.BlockNumber, _
return []byte{}, err return []byte{}, err
} }
if data.Reverted {
return []byte{}, evmtypes.NewExecErrorWithReason(data.Ret)
}
return (hexutil.Bytes)(data.Ret), nil return (hexutil.Bytes)(data.Ret), nil
} }
@ -547,6 +544,13 @@ func (e *PublicAPI) doCall(
return nil, err return nil, err
} }
if res.Failed() {
if res.VmError == vm.ErrExecutionReverted.Error() {
return nil, evmtypes.NewExecErrorWithReason(res.Ret)
}
return nil, errors.New(res.VmError)
}
return res, nil return res, nil
} }
@ -562,10 +566,6 @@ func (e *PublicAPI) EstimateGas(args evmtypes.CallArgs) (hexutil.Uint64, error)
return 0, err return 0, err
} }
if data.Reverted {
return 0, evmtypes.NewExecErrorWithReason(data.Ret)
}
return hexutil.Uint64(data.GasUsed), nil return hexutil.Uint64(data.GasUsed), nil
} }
@ -781,7 +781,7 @@ func (e *PublicAPI) GetTransactionReceipt(hash common.Hash) (map[string]interfac
// Get the transaction result from the log // Get the transaction result from the log
var status hexutil.Uint var status hexutil.Uint
if strings.Contains(res.TxResult.GetLog(), evmtypes.AttributeKeyEthereumTxReverted) { if strings.Contains(res.TxResult.GetLog(), evmtypes.AttributeKeyEthereumTxFailed) {
status = hexutil.Uint(ethtypes.ReceiptStatusFailed) status = hexutil.Uint(ethtypes.ReceiptStatusFailed)
} else { } else {
status = hexutil.Uint(ethtypes.ReceiptStatusSuccessful) status = hexutil.Uint(ethtypes.ReceiptStatusSuccessful)

View File

@ -121,8 +121,8 @@ message MsgEthereumTxResponse {
repeated Log logs = 2; repeated Log logs = 2;
// returned data from evm function (result or data supplied with revert opcode) // returned data from evm function (result or data supplied with revert opcode)
bytes ret = 3; bytes ret = 3;
// reverted flag is set to true when the call has been reverted // vm error is the error returned by vm execution
bool reverted = 4; string vm_error = 4;
// gas consumed by the transaction // gas consumed by the transaction
uint64 gas_used = 5; uint64 gas_used = 5;
} }

View File

@ -385,14 +385,11 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms
} }
evm := k.NewEVM(msg, ethCfg, params, coinbase) evm := k.NewEVM(msg, ethCfg, params, coinbase)
res, err := k.ApplyMessage(evm, msg, ethCfg) // pass true means execute in query mode, which don't do actual gas refund.
res, err := k.ApplyMessage(evm, msg, ethCfg, true)
if err != nil { if err != nil {
return nil, status.Error(codes.Internal, err.Error()) return nil, status.Error(codes.Internal, err.Error())
} }
// ApplyMessage don't handle gas refund, let's do it here
refund := k.GasToRefund(res.GasUsed)
res.GasUsed -= refund
return res, nil return res, nil
} }

View File

@ -75,8 +75,8 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t
attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyRecipient, tx.To().Hex())) attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyRecipient, tx.To().Hex()))
} }
if response.Reverted { if response.Failed() {
attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyEthereumTxReverted, "true")) attrs = append(attrs, sdk.NewAttribute(types.AttributeKeyEthereumTxFailed, response.VmError))
} }
// emit events // emit events

View File

@ -1,7 +1,6 @@
package keeper package keeper
import ( import (
"errors"
"math/big" "math/big"
"os" "os"
"time" "time"
@ -140,7 +139,8 @@ func (k *Keeper) ApplyTransaction(tx *ethtypes.Transaction) (*types.MsgEthereumT
k.SetTxHashTransient(tx.Hash()) k.SetTxHashTransient(tx.Hash())
k.IncreaseTxIndexTransient() k.IncreaseTxIndexTransient()
res, err := k.ApplyMessage(evm, msg, ethCfg) // pass false to execute in real mode, which do actual gas refunding
res, err := k.ApplyMessage(evm, msg, ethCfg, false)
if err != nil { if err != nil {
return nil, stacktrace.Propagate(err, "failed to apply ethereum core message") return nil, stacktrace.Propagate(err, "failed to apply ethereum core message")
} }
@ -150,14 +150,14 @@ func (k *Keeper) ApplyTransaction(tx *ethtypes.Transaction) (*types.MsgEthereumT
logs := k.GetTxLogs(txHash) logs := k.GetTxLogs(txHash)
// Commit and switch to original context // Commit and switch to original context
if !res.Reverted { if !res.Failed() {
commit() commit()
} }
k.ctx = originalCtx k.ctx = originalCtx
// Logs needs to be ignored when tx is reverted // Logs needs to be ignored when tx is reverted
// Set the log and bloom filter only when the tx is NOT REVERTED // Set the log and bloom filter only when the tx is NOT REVERTED
if !res.Reverted { if !res.Failed() {
res.Logs = types.NewLogsFromEth(logs) res.Logs = types.NewLogsFromEth(logs)
// Update block bloom filter in the original context because blockbloom is set in EndBlock // Update block bloom filter in the original context because blockbloom is set in EndBlock
bloom := k.GetBlockBloomTransient() bloom := k.GetBlockBloomTransient()
@ -165,14 +165,7 @@ func (k *Keeper) ApplyTransaction(tx *ethtypes.Transaction) (*types.MsgEthereumT
k.SetBlockBloomTransient(bloom) k.SetBlockBloomTransient(bloom)
} }
// refund gas prior to handling the vm error in order to set the updated gas meter
leftoverGas := msg.Gas() - res.GasUsed
leftoverGas, err = k.RefundGas(msg, leftoverGas)
if err != nil {
return nil, stacktrace.Propagate(err, "failed to refund gas leftover gas to sender %s", msg.From())
}
// update the gas used after refund // update the gas used after refund
res.GasUsed = msg.Gas() - leftoverGas
k.resetGasMeterAndConsumeGas(res.GasUsed) k.resetGasMeterAndConsumeGas(res.GasUsed)
return res, nil return res, nil
} }
@ -217,7 +210,12 @@ func (k *Keeper) ApplyTransaction(tx *ethtypes.Transaction) (*types.MsgEthereumT
// The preprocessing steps performed by the AnteHandler are: // The preprocessing steps performed by the AnteHandler are:
// //
// 1. set up the initial access list (iff fork > Berlin) // 1. set up the initial access list (iff fork > Berlin)
func (k *Keeper) ApplyMessage(evm *vm.EVM, msg core.Message, cfg *params.ChainConfig) (*types.MsgEthereumTxResponse, error) { //
// Query mode
//
// The grpc query endpoint EthCall calls this in query mode, and since the query handler don't call AnteHandler,
// so we don't do real gas refund in that case.
func (k *Keeper) ApplyMessage(evm *vm.EVM, msg core.Message, cfg *params.ChainConfig, query bool) (*types.MsgEthereumTxResponse, error) {
var ( var (
ret []byte // return bytes from evm execution ret []byte // return bytes from evm execution
vmErr error // vm errors do not effect consensus and are therefore not assigned to err vmErr error // vm errors do not effect consensus and are therefore not assigned to err
@ -231,7 +229,11 @@ func (k *Keeper) ApplyMessage(evm *vm.EVM, msg core.Message, cfg *params.ChainCo
// should have already been checked on Ante Handler // should have already been checked on Ante Handler
return nil, stacktrace.Propagate(err, "intrinsic gas failed") return nil, stacktrace.Propagate(err, "intrinsic gas failed")
} }
// should be > 0 as it is checked on Ante Handler // Should check again even if it is checked on Ante Handler, because eth_call don't go through Ante Handler.
if msg.Gas() < intrinsicGas {
// eth_estimateGas will check for this exact error
return nil, stacktrace.Propagate(core.ErrIntrinsicGas, "intrinsic gas too low")
}
leftoverGas := msg.Gas() - intrinsicGas leftoverGas := msg.Gas() - intrinsicGas
if contractCreation { if contractCreation {
@ -240,20 +242,28 @@ func (k *Keeper) ApplyMessage(evm *vm.EVM, msg core.Message, cfg *params.ChainCo
ret, leftoverGas, vmErr = evm.Call(sender, *msg.To(), msg.Data(), leftoverGas, msg.Value()) ret, leftoverGas, vmErr = evm.Call(sender, *msg.To(), msg.Data(), leftoverGas, msg.Value())
} }
var reverted bool if query {
if vmErr != nil { // query handlers don't call ante handler to deduct gas fee, so don't do actual refund here, because the
if !errors.Is(vmErr, vm.ErrExecutionReverted) { // module account balance might not be enough
// wrap the VM error leftoverGas += k.GasToRefund(msg.Gas() - leftoverGas)
return nil, stacktrace.Propagate(sdkerrors.Wrap(types.ErrVMExecution, vmErr.Error()), "vm execution failed") } else {
// refund gas prior to handling the vm error in order to set the updated gas meter
leftoverGas, err = k.RefundGas(msg, leftoverGas)
if err != nil {
return nil, stacktrace.Propagate(err, "failed to refund gas leftover gas to sender %s", msg.From())
} }
reverted = true }
var vmError string
if vmErr != nil {
vmError = vmErr.Error()
} }
gasUsed := msg.Gas() - leftoverGas gasUsed := msg.Gas() - leftoverGas
return &types.MsgEthereumTxResponse{ return &types.MsgEthereumTxResponse{
Ret: ret,
Reverted: reverted,
GasUsed: gasUsed, GasUsed: gasUsed,
VmError: vmError,
Ret: ret,
}, nil }, nil
} }

View File

@ -8,7 +8,8 @@ const (
AttributeKeyRecipient = "recipient" AttributeKeyRecipient = "recipient"
AttributeKeyTxHash = "txHash" AttributeKeyTxHash = "txHash"
AttributeKeyEthereumTxHash = "ethereumTxHash" AttributeKeyEthereumTxHash = "ethereumTxHash"
AttributeKeyEthereumTxReverted = "ethereumTxReverted" // tx failed in eth vm execution
AttributeKeyEthereumTxFailed = "ethereumTxFailed"
AttributeValueCategory = ModuleName AttributeValueCategory = ModuleName
MetricKeyTransitionDB = "transition_db" MetricKeyTransitionDB = "transition_db"

6
x/evm/types/tx.go Normal file
View File

@ -0,0 +1,6 @@
package types
// Failed returns if the contract execution failed in vm errors
func (m *MsgEthereumTxResponse) Failed() bool {
return len(m.VmError) > 0
}

View File

@ -274,8 +274,8 @@ type MsgEthereumTxResponse struct {
Logs []*Log `protobuf:"bytes,2,rep,name=logs,proto3" json:"logs,omitempty"` Logs []*Log `protobuf:"bytes,2,rep,name=logs,proto3" json:"logs,omitempty"`
// returned data from evm function (result or data supplied with revert opcode) // returned data from evm function (result or data supplied with revert opcode)
Ret []byte `protobuf:"bytes,3,opt,name=ret,proto3" json:"ret,omitempty"` Ret []byte `protobuf:"bytes,3,opt,name=ret,proto3" json:"ret,omitempty"`
// reverted flag is set to true when the call has been reverted // vm error is the error returned by vm execution
Reverted bool `protobuf:"varint,4,opt,name=reverted,proto3" json:"reverted,omitempty"` VmError string `protobuf:"bytes,4,opt,name=vm_error,json=vmError,proto3" json:"vm_error,omitempty"`
// gas consumed by the transaction // gas consumed by the transaction
GasUsed uint64 `protobuf:"varint,5,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"` GasUsed uint64 `protobuf:"varint,5,opt,name=gas_used,json=gasUsed,proto3" json:"gas_used,omitempty"`
} }
@ -325,54 +325,54 @@ func init() {
func init() { proto.RegisterFile("ethermint/evm/v1alpha1/tx.proto", fileDescriptor_6a305e80b084ab0e) } func init() { proto.RegisterFile("ethermint/evm/v1alpha1/tx.proto", fileDescriptor_6a305e80b084ab0e) }
var fileDescriptor_6a305e80b084ab0e = []byte{ var fileDescriptor_6a305e80b084ab0e = []byte{
// 748 bytes of a gzipped FileDescriptorProto // 750 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x41, 0x6f, 0xd3, 0x4a, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x41, 0x6b, 0xdb, 0x48,
0x10, 0xce, 0x26, 0x4e, 0xe2, 0x6c, 0xf2, 0xaa, 0xa7, 0x55, 0x5f, 0xe5, 0xe6, 0x49, 0x76, 0x94, 0x14, 0xf6, 0xd8, 0xb2, 0x2d, 0x8f, 0xbd, 0x61, 0x19, 0xb2, 0x41, 0xf1, 0x82, 0x64, 0xbc, 0xec,
0xa7, 0x87, 0x22, 0xa4, 0xd8, 0x6a, 0xcb, 0xa9, 0x27, 0x6a, 0x5a, 0x55, 0x45, 0xa9, 0x40, 0xab, 0x62, 0x16, 0x2c, 0x91, 0x64, 0x4f, 0x39, 0x6d, 0xb4, 0x09, 0x21, 0x8b, 0xc3, 0x2e, 0xc2, 0xa5,
0x20, 0x24, 0x38, 0x54, 0x1b, 0x67, 0xeb, 0x58, 0xc4, 0xde, 0xc8, 0xbb, 0x89, 0x12, 0x7e, 0x01, 0xd0, 0x1e, 0xc2, 0x58, 0x9e, 0xc8, 0xa2, 0x96, 0xc6, 0x68, 0xc6, 0xc2, 0xee, 0x2f, 0xe8, 0xad,
0x37, 0xf8, 0x09, 0x9c, 0xe1, 0x08, 0x3f, 0xa2, 0xc7, 0x8a, 0x13, 0xe2, 0x60, 0x50, 0x7a, 0xeb, 0xfd, 0x09, 0x3d, 0xe7, 0xda, 0xfe, 0x88, 0x1c, 0x43, 0x4f, 0xa5, 0x07, 0xb5, 0x38, 0xb7, 0x1c,
0x91, 0x0b, 0x57, 0xe4, 0xb5, 0x93, 0x34, 0x40, 0x50, 0x11, 0x9c, 0x3c, 0xe3, 0xf9, 0x76, 0x67, 0x7b, 0xe9, 0xb5, 0xcc, 0x48, 0xb6, 0xe3, 0xb6, 0x2e, 0x29, 0xed, 0x49, 0xef, 0xe9, 0x7d, 0x33,
0xf6, 0xfb, 0x66, 0x06, 0x1a, 0x54, 0xf4, 0x68, 0xe8, 0x7b, 0x81, 0xb0, 0xe8, 0xc8, 0xb7, 0x46, 0xef, 0xcd, 0xf7, 0xbd, 0xf7, 0xa0, 0x41, 0xf8, 0x80, 0x44, 0x81, 0x1f, 0x72, 0x8b, 0xc4, 0x81,
0x5b, 0xa4, 0x3f, 0xe8, 0x91, 0x2d, 0x4b, 0x8c, 0xcd, 0x41, 0xc8, 0x04, 0x43, 0x1b, 0x73, 0x80, 0x15, 0xef, 0xe0, 0xe1, 0x68, 0x80, 0x77, 0x2c, 0x3e, 0x31, 0x47, 0x11, 0xe5, 0x14, 0x6d, 0x2d,
0x49, 0x47, 0xbe, 0x39, 0x03, 0x54, 0xd7, 0x5d, 0xe6, 0x32, 0x09, 0xb1, 0x62, 0x2b, 0x41, 0x57, 0x00, 0x26, 0x89, 0x03, 0x73, 0x0e, 0xa8, 0x6f, 0x7a, 0xd4, 0xa3, 0x12, 0x62, 0x09, 0x2b, 0x45,
0x37, 0x5d, 0xc6, 0xdc, 0x3e, 0xb5, 0xa4, 0xd7, 0x19, 0x9e, 0x5a, 0x24, 0x98, 0xcc, 0x42, 0x0e, 0xd7, 0xb7, 0x3d, 0x4a, 0xbd, 0x21, 0xb1, 0xa4, 0xd7, 0x1b, 0x9f, 0x5b, 0x38, 0x9c, 0xce, 0x43,
0xe3, 0x3e, 0xe3, 0x27, 0xc9, 0x99, 0xc4, 0x49, 0x43, 0xb5, 0x15, 0x45, 0xc4, 0x09, 0x25, 0xa2, 0x2e, 0x65, 0x01, 0x65, 0x67, 0xe9, 0x99, 0xd4, 0xc9, 0x42, 0x8d, 0x35, 0x45, 0x88, 0x84, 0x12,
0xfe, 0x1c, 0xc0, 0xbf, 0x8e, 0xb9, 0x7b, 0x10, 0xe3, 0xe8, 0xd0, 0x6f, 0x8f, 0x51, 0x03, 0x2a, 0xd1, 0x7c, 0x0a, 0xe0, 0x4f, 0xa7, 0xcc, 0x3b, 0x12, 0x38, 0x32, 0x0e, 0xba, 0x13, 0xd4, 0x82,
0x5d, 0x22, 0x88, 0x06, 0x6a, 0xa0, 0x51, 0xde, 0x5e, 0x37, 0x93, 0xc4, 0xe6, 0x2c, 0xb1, 0xb9, 0x4a, 0x1f, 0x73, 0xac, 0x81, 0x06, 0x68, 0x55, 0x77, 0x37, 0xcd, 0x34, 0xb1, 0x39, 0x4f, 0x6c,
0x17, 0x4c, 0xb0, 0x44, 0xa0, 0x4d, 0xa8, 0x70, 0xef, 0x29, 0xd5, 0xb2, 0x35, 0xd0, 0x00, 0x76, 0x1e, 0x84, 0x53, 0x47, 0x22, 0xd0, 0x36, 0x54, 0x98, 0xff, 0x98, 0x68, 0xf9, 0x06, 0x68, 0x01,
0xfe, 0x32, 0x32, 0x40, 0x13, 0xcb, 0x5f, 0xc8, 0x80, 0x4a, 0x8f, 0xf0, 0x9e, 0x96, 0xab, 0x81, 0xbb, 0x78, 0x93, 0x18, 0xa0, 0xed, 0xc8, 0x5f, 0xc8, 0x80, 0xca, 0x00, 0xb3, 0x81, 0x56, 0x68,
0x46, 0xc9, 0x2e, 0x7f, 0x8e, 0x8c, 0x62, 0xd8, 0x1f, 0xec, 0xd6, 0x9b, 0x75, 0x2c, 0x03, 0x08, 0x80, 0x56, 0xc5, 0xae, 0xbe, 0x4f, 0x8c, 0x72, 0x34, 0x1c, 0xed, 0x37, 0xdb, 0x4d, 0x47, 0x06,
0x41, 0xe5, 0x34, 0x64, 0xbe, 0xa6, 0xc4, 0x00, 0x2c, 0xed, 0x5d, 0xe5, 0xd9, 0x4b, 0x23, 0x53, 0x10, 0x82, 0xca, 0x79, 0x44, 0x03, 0x4d, 0x11, 0x00, 0x47, 0xda, 0xfb, 0xca, 0x93, 0xe7, 0x46,
0x7f, 0x93, 0x85, 0x6a, 0x8b, 0xba, 0xc4, 0x99, 0xb4, 0xc7, 0x68, 0x1d, 0xe6, 0x03, 0x16, 0x38, 0xae, 0xf9, 0x22, 0x0f, 0xd5, 0x0e, 0xf1, 0xb0, 0x3b, 0xed, 0x4e, 0xd0, 0x26, 0x2c, 0x86, 0x34,
0x54, 0x56, 0xa3, 0xe0, 0xc4, 0x41, 0x87, 0xb0, 0xe4, 0x92, 0xf8, 0xc1, 0x9e, 0x93, 0x64, 0x2f, 0x74, 0x89, 0xac, 0x46, 0x71, 0x52, 0x07, 0x1d, 0xc3, 0x8a, 0x87, 0xc5, 0x83, 0x7d, 0x37, 0xcd,
0xd9, 0x37, 0x3f, 0x44, 0xc6, 0x0d, 0xd7, 0x13, 0xbd, 0x61, 0xc7, 0x74, 0x98, 0x9f, 0xd2, 0x90, 0x5e, 0xb1, 0xff, 0x7c, 0x93, 0x18, 0x7f, 0x78, 0x3e, 0x1f, 0x8c, 0x7b, 0xa6, 0x4b, 0x83, 0x8c,
0x7e, 0x9a, 0xbc, 0xfb, 0xc4, 0x12, 0x93, 0x01, 0xe5, 0xe6, 0x51, 0x20, 0xb0, 0xea, 0x12, 0x7e, 0x86, 0xec, 0xd3, 0x66, 0xfd, 0x47, 0x16, 0x9f, 0x8e, 0x08, 0x33, 0x4f, 0x42, 0xee, 0xa8, 0x1e,
0x3f, 0x3e, 0x8b, 0x74, 0x98, 0x73, 0x09, 0x97, 0x55, 0x2a, 0x76, 0x65, 0x1a, 0x19, 0xea, 0x21, 0x66, 0xff, 0x8b, 0xb3, 0x48, 0x87, 0x05, 0x0f, 0x33, 0x59, 0xa5, 0x62, 0xd7, 0x66, 0x89, 0xa1,
0xe1, 0x2d, 0xcf, 0xf7, 0x04, 0x8e, 0x03, 0x68, 0x0d, 0x66, 0x05, 0x4b, 0x6b, 0xcc, 0x0a, 0x86, 0x1e, 0x63, 0xd6, 0xf1, 0x03, 0x9f, 0x3b, 0x22, 0x80, 0x36, 0x60, 0x9e, 0xd3, 0xac, 0xc6, 0x3c,
0xee, 0xc2, 0xfc, 0x88, 0xf4, 0x87, 0x54, 0xcb, 0xcb, 0xa4, 0xb7, 0xae, 0x9f, 0x74, 0x1a, 0x19, 0xa7, 0xe8, 0x5f, 0x58, 0x8c, 0xf1, 0x70, 0x4c, 0xb4, 0xa2, 0x4c, 0xfa, 0xd7, 0xdd, 0x93, 0xce,
0x85, 0x3d, 0x9f, 0x0d, 0x03, 0x81, 0x93, 0x2b, 0x62, 0x06, 0x24, 0xcf, 0x85, 0x1a, 0x68, 0x54, 0x12, 0xa3, 0x74, 0x10, 0xd0, 0x71, 0xc8, 0x9d, 0xf4, 0x0a, 0xc1, 0x80, 0xe4, 0xb9, 0xd4, 0x00,
0x52, 0x46, 0x2b, 0x10, 0x8c, 0xb4, 0xa2, 0xfc, 0x01, 0x46, 0xb1, 0x17, 0x6a, 0x6a, 0xe2, 0x85, 0xad, 0x5a, 0xc6, 0x68, 0x0d, 0x82, 0x58, 0x2b, 0xcb, 0x1f, 0x20, 0x16, 0x5e, 0xa4, 0xa9, 0xa9,
0xb1, 0xc7, 0xb5, 0x52, 0xe2, 0xf1, 0xdd, 0xb5, 0x98, 0xab, 0x77, 0x6f, 0x9b, 0x85, 0xf6, 0x78, 0x17, 0x09, 0x8f, 0x69, 0x95, 0xd4, 0x63, 0xfb, 0x1b, 0x82, 0xab, 0x57, 0x2f, 0xdb, 0xa5, 0xee,
0x9f, 0x08, 0x52, 0xff, 0x92, 0x83, 0x95, 0x3d, 0xc7, 0xa1, 0x9c, 0xb7, 0x3c, 0x2e, 0xda, 0x63, 0xe4, 0x10, 0x73, 0xdc, 0xfc, 0x50, 0x80, 0xb5, 0x03, 0xd7, 0x25, 0x8c, 0x75, 0x7c, 0xc6, 0xbb,
0xf4, 0x18, 0xaa, 0x4e, 0x8f, 0x78, 0xc1, 0x89, 0xd7, 0x95, 0xe4, 0x95, 0xec, 0xdb, 0xbf, 0x54, 0x13, 0xf4, 0x10, 0xaa, 0xee, 0x00, 0xfb, 0xe1, 0x99, 0xdf, 0x97, 0xe4, 0x55, 0xec, 0xbf, 0xbf,
0x6d, 0xf1, 0x4e, 0x7c, 0xfa, 0x68, 0xff, 0x32, 0x32, 0x8a, 0x4e, 0x62, 0xe2, 0xd4, 0xe8, 0x2e, 0xa9, 0xda, 0xf2, 0x3f, 0xe2, 0xf4, 0xc9, 0xe1, 0x4d, 0x62, 0x94, 0xdd, 0xd4, 0x74, 0x32, 0xa3,
0x64, 0xc9, 0xae, 0x94, 0x25, 0xf7, 0xfb, 0xb2, 0x28, 0x3f, 0x97, 0x25, 0xff, 0xbd, 0x2c, 0x85, 0xbf, 0x94, 0x25, 0xbf, 0x56, 0x96, 0xc2, 0xf7, 0xcb, 0xa2, 0x7c, 0x5d, 0x96, 0xe2, 0xe7, 0xb2,
0x3f, 0x27, 0x4b, 0xf1, 0x8a, 0x2c, 0x04, 0xaa, 0x44, 0x72, 0x4b, 0xb9, 0xa6, 0xd6, 0x72, 0x8d, 0x94, 0x7e, 0x9c, 0x2c, 0xe5, 0x5b, 0xb2, 0x60, 0xa8, 0x62, 0xc9, 0x2d, 0x61, 0x9a, 0xda, 0x28,
0xf2, 0xf6, 0x7f, 0xe6, 0x8f, 0xa7, 0xd7, 0x4c, 0x34, 0x68, 0x0f, 0x07, 0x7d, 0x6a, 0xd7, 0xce, 0xb4, 0xaa, 0xbb, 0xbf, 0x99, 0x5f, 0x9e, 0x5e, 0x33, 0xd5, 0xa0, 0x3b, 0x1e, 0x0d, 0x89, 0xdd,
0x22, 0x23, 0x73, 0x19, 0x19, 0x90, 0xcc, 0x85, 0x79, 0xf5, 0xd1, 0x80, 0x0b, 0x99, 0xf0, 0xfc, 0xb8, 0x4c, 0x8c, 0xdc, 0x4d, 0x62, 0x40, 0xbc, 0x10, 0xe6, 0xe2, 0xad, 0x01, 0x97, 0x32, 0x39,
0xda, 0x44, 0xf9, 0xd2, 0x92, 0xf2, 0x70, 0x49, 0xf9, 0xf2, 0x2a, 0xe5, 0xeb, 0xb0, 0x7a, 0x30, 0x8b, 0x6b, 0x53, 0xe5, 0x2b, 0x2b, 0xca, 0xc3, 0x15, 0xe5, 0xab, 0xeb, 0x94, 0x6f, 0xc2, 0xfa,
0x16, 0x34, 0xe0, 0x1e, 0x0b, 0xee, 0x0d, 0x84, 0xc7, 0x02, 0xbe, 0x98, 0xe6, 0x74, 0xa6, 0x74, 0xd1, 0x84, 0x93, 0x90, 0xf9, 0x34, 0xfc, 0x6f, 0xc4, 0x7d, 0x1a, 0xb2, 0xe5, 0x34, 0x67, 0x33,
0xb8, 0xf1, 0x2d, 0xe6, 0x21, 0xed, 0xec, 0xcc, 0xe3, 0xaf, 0x01, 0xfc, 0x67, 0x69, 0x0b, 0x60, 0xa5, 0xc3, 0xad, 0x4f, 0x31, 0xf7, 0x49, 0x6f, 0x6f, 0x11, 0xbf, 0x00, 0xf0, 0x97, 0x95, 0x2d,
0xca, 0x07, 0x2c, 0xe0, 0x92, 0x0e, 0x39, 0xc8, 0x20, 0x99, 0x53, 0x39, 0xbb, 0x16, 0x54, 0xfa, 0xe0, 0x10, 0x36, 0xa2, 0x21, 0x93, 0x74, 0xc8, 0x41, 0x06, 0xe9, 0x9c, 0xca, 0xd9, 0xb5, 0xa0,
0xcc, 0xe5, 0x5a, 0x56, 0x52, 0xf1, 0xef, 0x2a, 0x2a, 0x5a, 0xcc, 0xc5, 0x12, 0x88, 0xfe, 0x86, 0x32, 0xa4, 0x1e, 0xd3, 0xf2, 0x92, 0x8a, 0x5f, 0xd7, 0x51, 0xd1, 0xa1, 0x9e, 0x23, 0x81, 0xe8,
0xb9, 0x90, 0x0a, 0xd9, 0x12, 0x15, 0x1c, 0x9b, 0xa8, 0x0a, 0xd5, 0x90, 0x8e, 0x68, 0x28, 0x68, 0x67, 0x58, 0x88, 0x08, 0x97, 0x2d, 0x51, 0x73, 0x84, 0x89, 0xb6, 0xa1, 0x1a, 0x07, 0x67, 0x24,
0x57, 0xca, 0xac, 0xe2, 0xb9, 0x8f, 0x36, 0x61, 0xdc, 0x09, 0x27, 0x43, 0x4e, 0xbb, 0x52, 0x63, 0x8a, 0x68, 0x94, 0x8d, 0x57, 0x39, 0x0e, 0x8e, 0x84, 0x2b, 0x42, 0xa2, 0x8b, 0xc6, 0x8c, 0xf4,
0x05, 0x17, 0x5d, 0xc2, 0x1f, 0x70, 0xda, 0x4d, 0xaa, 0xdd, 0xf6, 0x60, 0xee, 0x98, 0xbb, 0xa8, 0xa5, 0xc4, 0x8a, 0x53, 0xf6, 0x30, 0xbb, 0xc7, 0x48, 0x3f, 0x2d, 0x76, 0xd7, 0x87, 0x85, 0x53,
0x03, 0xe1, 0x95, 0xb5, 0xf5, 0xff, 0xaa, 0x32, 0x96, 0xde, 0x55, 0x6d, 0x5e, 0x0b, 0x36, 0x7b, 0xe6, 0xa1, 0x1e, 0x84, 0xb7, 0xb6, 0xd6, 0xef, 0xeb, 0xaa, 0x58, 0x79, 0x56, 0xbd, 0x7d, 0x27,
0xbe, 0x6d, 0x9f, 0x4d, 0x75, 0x70, 0x3e, 0xd5, 0xc1, 0xa7, 0xa9, 0x0e, 0x5e, 0x5c, 0xe8, 0x99, 0xd8, 0xfc, 0xf5, 0xb6, 0x7d, 0x39, 0xd3, 0xc1, 0xd5, 0x4c, 0x07, 0xef, 0x66, 0x3a, 0x78, 0x76,
0xf3, 0x0b, 0x3d, 0xf3, 0xfe, 0x42, 0xcf, 0x3c, 0x6a, 0x5c, 0x69, 0x30, 0xd1, 0x23, 0x21, 0xf7, 0xad, 0xe7, 0xae, 0xae, 0xf5, 0xdc, 0xeb, 0x6b, 0x3d, 0xf7, 0xa0, 0x75, 0xab, 0xbf, 0xf8, 0x00,
0xb8, 0xb5, 0xd8, 0xb6, 0x63, 0xb9, 0x6f, 0x65, 0x9b, 0x75, 0x0a, 0x72, 0x75, 0xee, 0x7c, 0x0d, 0x47, 0xcc, 0x67, 0xd6, 0x72, 0xd9, 0x4e, 0xe4, 0xba, 0x95, 0x5d, 0xd6, 0x2b, 0xc9, 0xcd, 0xb9,
0x00, 0x00, 0xff, 0xff, 0x19, 0x9b, 0x13, 0xd4, 0x12, 0x06, 0x00, 0x00, 0xf7, 0x31, 0x00, 0x00, 0xff, 0xff, 0x32, 0x13, 0x74, 0x7d, 0x11, 0x06, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -793,15 +793,12 @@ func (m *MsgEthereumTxResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i-- i--
dAtA[i] = 0x28 dAtA[i] = 0x28
} }
if m.Reverted { if len(m.VmError) > 0 {
i -= len(m.VmError)
copy(dAtA[i:], m.VmError)
i = encodeVarintTx(dAtA, i, uint64(len(m.VmError)))
i-- i--
if m.Reverted { dAtA[i] = 0x22
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x20
} }
if len(m.Ret) > 0 { if len(m.Ret) > 0 {
i -= len(m.Ret) i -= len(m.Ret)
@ -1003,8 +1000,9 @@ func (m *MsgEthereumTxResponse) Size() (n int) {
if l > 0 { if l > 0 {
n += 1 + l + sovTx(uint64(l)) n += 1 + l + sovTx(uint64(l))
} }
if m.Reverted { l = len(m.VmError)
n += 2 if l > 0 {
n += 1 + l + sovTx(uint64(l))
} }
if m.GasUsed != 0 { if m.GasUsed != 0 {
n += 1 + sovTx(uint64(m.GasUsed)) n += 1 + sovTx(uint64(m.GasUsed))
@ -2135,10 +2133,10 @@ func (m *MsgEthereumTxResponse) Unmarshal(dAtA []byte) error {
} }
iNdEx = postIndex iNdEx = postIndex
case 4: case 4:
if wireType != 0 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Reverted", wireType) return fmt.Errorf("proto: wrong wireType = %d for field VmError", wireType)
} }
var v int var stringLen uint64
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
if shift >= 64 { if shift >= 64 {
return ErrIntOverflowTx return ErrIntOverflowTx
@ -2148,12 +2146,24 @@ func (m *MsgEthereumTxResponse) Unmarshal(dAtA []byte) error {
} }
b := dAtA[iNdEx] b := dAtA[iNdEx]
iNdEx++ iNdEx++
v |= int(b&0x7F) << shift stringLen |= uint64(b&0x7F) << shift
if b < 0x80 { if b < 0x80 {
break break
} }
} }
m.Reverted = bool(v != 0) intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthTx
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthTx
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.VmError = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 5: case 5:
if wireType != 0 { if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType) return fmt.Errorf("proto: wrong wireType = %d for field GasUsed", wireType)