// Copyright 2021 Evmos Foundation // This file is part of Evmos' Ethermint library. // // The Ethermint library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The Ethermint library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE package cli import ( "bufio" "fmt" "os" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/input" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/pkg/errors" "github.com/spf13/cobra" rpctypes "github.com/evmos/ethermint/rpc/types" "github.com/evmos/ethermint/x/evm/types" ) // GetTxCmd returns the transaction commands for this module func GetTxCmd() *cobra.Command { cmd := &cobra.Command{ Use: types.ModuleName, Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), DisableFlagParsing: true, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } cmd.AddCommand(NewRawTxCmd()) return cmd } // NewRawTxCmd command build cosmos transaction from raw ethereum transaction func NewRawTxCmd() *cobra.Command { cmd := &cobra.Command{ Use: "raw TX_HEX", Short: "Build cosmos transaction from raw ethereum transaction", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { data, err := hexutil.Decode(args[0]) if err != nil { return errors.Wrap(err, "failed to decode ethereum tx hex bytes") } msg := &types.MsgEthereumTx{} if err := msg.UnmarshalBinary(data); err != nil { return err } if err := msg.ValidateBasic(); err != nil { return err } clientCtx, err := client.GetClientTxContext(cmd) if err != nil { return err } rsp, err := rpctypes.NewQueryClient(clientCtx).Params(cmd.Context(), &types.QueryParamsRequest{}) if err != nil { return err } tx, err := msg.BuildTx(clientCtx.TxConfig.NewTxBuilder(), rsp.Params.EvmDenom) if err != nil { return err } if clientCtx.GenerateOnly { json, err := clientCtx.TxConfig.TxJSONEncoder()(tx) if err != nil { return err } return clientCtx.PrintString(fmt.Sprintf("%s\n", json)) } if !clientCtx.SkipConfirm { out, err := clientCtx.TxConfig.TxJSONEncoder()(tx) if err != nil { return err } _, _ = fmt.Fprintf(os.Stderr, "%s\n\n", out) buf := bufio.NewReader(os.Stdin) ok, err := input.GetConfirmation("confirm transaction before signing and broadcasting", buf, os.Stderr) if err != nil || !ok { _, _ = fmt.Fprintf(os.Stderr, "%s\n", "canceled transaction") return err } } txBytes, err := clientCtx.TxConfig.TxEncoder()(tx) if err != nil { return err } // broadcast to a Tendermint node res, err := clientCtx.BroadcastTx(txBytes) if err != nil { return err } return clientCtx.PrintProto(res) }, } flags.AddTxFlagsToCmd(cmd) return cmd }