Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 43 additions & 51 deletions app/ante/evm_checktx.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"math"
"math/big"

"github.com/cosmos/cosmos-sdk/client"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
Expand Down Expand Up @@ -34,70 +33,37 @@ import (

func EvmCheckTxAnte(
ctx sdk.Context,
txConfig client.TxConfig,
tx sdk.Tx,
upgradeKeeper *upgradekeeper.Keeper,
ek *evmkeeper.Keeper,
latestCtxGetter func() sdk.Context,
) (returnCtx sdk.Context, returnErr error) {
chainID := ek.ChainID(ctx)
if err := EvmStatelessChecks(ctx, tx, chainID); err != nil {
return ctx, err
}
msg := tx.GetMsgs()[0].(*evmtypes.MsgEVMTransaction)

txData, _ := evmtypes.UnpackTxData(msg.Data) // cached and validated
ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx))
if atx, ok := txData.(*ethtx.AssociateTx); ok {
return HandleAssociateTx(ctx, ek, atx)
}
etx := ethtypes.NewTx(txData.AsEthereumData())
evmAddr, seiAddr, seiPubkey, version, err := CheckAndDecodeSignature(ctx, txData, chainID)
if err != nil {
return ctx, err
}
if err := AssociateAddress(ctx, ek, evmAddr, seiAddr, seiPubkey); err != nil {
return ctx, err
}
if err := EvmCheckAndChargeFees(ctx, evmAddr, ek, upgradeKeeper, txData, etx, msg, version); err != nil {
return ctx, err
}

ctx, err = CheckNonce(ctx, latestCtxGetter, ek, etx, evmAddr, seiAddr)
if err != nil {
return ctx, err
}

return DecorateContext(ctx, ek, tx, txData, etx, evmAddr), nil
}

func EvmStatelessChecks(ctx sdk.Context, tx sdk.Tx, chainID *big.Int) error {
txBody, ok := tx.(TxBody)
if ok {
body := txBody.GetBody()
if body.Memo != "" {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "memo must be empty for EVM txs")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "memo must be empty for EVM txs")
}
if body.TimeoutHeight != 0 {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "timeout_height must be zero for EVM txs")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "timeout_height must be zero for EVM txs")
}
if len(body.ExtensionOptions) > 0 || len(body.NonCriticalExtensionOptions) > 0 {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "extension options must be empty for EVM txs")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "extension options must be empty for EVM txs")
}
}

txAuth, ok := tx.(TxAuthInfo)
if ok {
authInfo := txAuth.GetAuthInfo()
if len(authInfo.SignerInfos) > 0 {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "signer_infos must be empty for EVM txs")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "signer_infos must be empty for EVM txs")
}
if authInfo.Fee != nil {
if len(authInfo.Fee.Amount) > 0 {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "fee amount must be empty for EVM txs")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "fee amount must be empty for EVM txs")
}
if authInfo.Fee.Payer != "" || authInfo.Fee.Granter != "" {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "fee payer and granter must be empty for EVM txs")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "fee payer and granter must be empty for EVM txs")
}
}
}
Expand All @@ -106,35 +72,61 @@ func EvmStatelessChecks(ctx sdk.Context, tx sdk.Tx, chainID *big.Int) error {
if ok {
sigs, err := txSig.GetSignaturesV2()
if err != nil {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "could not get signatures")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "could not get signatures")
}
if len(sigs) > 0 {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "signatures must be empty for EVM txs")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "signatures must be empty for EVM txs")
}
}

if len(tx.GetMsgs()) != 1 {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "EVM transaction must have exactly 1 message")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "EVM transaction must have exactly 1 message")
}

msg, ok := tx.GetMsgs()[0].(*evmtypes.MsgEVMTransaction)
if !ok {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "not EVM message")
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "not EVM message")
}

if err := msg.ValidateBasic(); err != nil {
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, err.Error())
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, err.Error())
}
txData, err := evmtypes.UnpackTxData(msg.Data)

etx, txData, err := msg.AsTransaction()
if err != nil {
return err
return ctx, err
}
if _, ok := txData.(*ethtx.AssociateTx); ok {
return nil

if atx, ok := txData.(*ethtx.AssociateTx); ok {
return HandleAssociateTx(ctx, ek, atx)
}
etx, _, err := msg.AsTransaction()

chainID := ek.ChainID(ctx)
if err := EvmStatelessChecks(ctx, etx, txData, chainID); err != nil {
return ctx, err
}

ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeterWithMultiplier(ctx))
evmAddr, seiAddr, seiPubkey, version, err := CheckAndDecodeSignature(ctx, txData, chainID)
if err != nil {
return err
return ctx, err
}
if err := AssociateAddress(ctx, ek, evmAddr, seiAddr, seiPubkey); err != nil {
return ctx, err
}
if err := EvmCheckAndChargeFees(ctx, evmAddr, ek, upgradeKeeper, txData, etx, msg, version); err != nil {
return ctx, err
}

ctx, err = CheckNonce(ctx, latestCtxGetter, ek, etx, evmAddr, seiAddr)
if err != nil {
return ctx, err
}

return DecorateContext(ctx, ek, tx, txData, etx, evmAddr), nil
}

func EvmStatelessChecks(ctx sdk.Context, etx *ethtypes.Transaction, txData ethtx.TxData, chainID *big.Int) error {
if etx.To() == nil && len(etx.Data()) > params.MaxInitCodeSize {
return fmt.Errorf("%w: code size %v, limit %v", core.ErrMaxInitCodeSizeExceeded, len(etx.Data()), params.MaxInitCodeSize)
}
Expand Down
2 changes: 1 addition & 1 deletion app/legacyabci/check_tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func CheckTx(
if isEVM, evmerr := evmante.IsEVMMessage(tx); evmerr != nil {
err = evmerr
} else if isEVM {
newCtx, err = ante.EvmCheckTxAnte(anteCtx, txConfig, tx, keepers.UpgradeKeeper, keepers.EvmKeeper, latestCtxGetter)
newCtx, err = ante.EvmCheckTxAnte(anteCtx, tx, keepers.UpgradeKeeper, keepers.EvmKeeper, latestCtxGetter)
} else {
newCtx, err = ante.CosmosCheckTxAnte(anteCtx, txConfig, tx, keepers.ParamsKeeper, keepers.OracleKeeper, keepers.EvmKeeper, keepers.AccountKeeper, keepers.BankKeeper, keepers.FeeGrantKeeper, keepers.IBCKeeper)
}
Expand Down
Loading