package main import ( "encoding/json" "io" "github.com/spf13/cobra" "github.com/spf13/viper" abci "github.com/tendermint/tendermint/abci/types" tmamino "github.com/tendermint/tendermint/crypto/encoding/amino" "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/log" tmtypes "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client/flags" clientkeys "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/server" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/genutil" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/ethermint/app" "github.com/cosmos/ethermint/client" "github.com/cosmos/ethermint/codec" "github.com/cosmos/ethermint/crypto/ethsecp256k1" ethermint "github.com/cosmos/ethermint/types" ) const flagInvCheckPeriod = "inv-check-period" var invCheckPeriod uint func main() { cobra.EnableCommandSorting = false cdc := codec.MakeCodec(app.ModuleBasics) tmamino.RegisterKeyType(ethsecp256k1.PubKey{}, ethsecp256k1.PubKeyName) tmamino.RegisterKeyType(ethsecp256k1.PrivKey{}, ethsecp256k1.PrivKeyName) keys.CryptoCdc = cdc genutil.ModuleCdc = cdc genutiltypes.ModuleCdc = cdc clientkeys.KeysCdc = cdc config := sdk.GetConfig() ethermint.SetBech32Prefixes(config) ethermint.SetBip44CoinType(config) config.Seal() ctx := server.NewDefaultContext() rootCmd := &cobra.Command{ Use: "ethermintd", Short: "Ethermint App Daemon (server)", PersistentPreRunE: server.PersistentPreRunEFn(ctx), } // CLI commands to initialize the chain rootCmd.AddCommand( client.GenerateChainID( client.ValidateChainID( genutilcli.InitCmd(ctx, cdc, app.ModuleBasics, app.DefaultNodeHome), ), ), genutilcli.CollectGenTxsCmd(ctx, cdc, auth.GenesisAccountIterator{}, app.DefaultNodeHome), genutilcli.MigrateGenesisCmd(ctx, cdc), genutilcli.GenTxCmd( ctx, cdc, app.ModuleBasics, staking.AppModuleBasic{}, auth.GenesisAccountIterator{}, app.DefaultNodeHome, app.DefaultCLIHome, ), genutilcli.ValidateGenesisCmd(ctx, cdc, app.ModuleBasics), client.TestnetCmd(ctx, cdc, app.ModuleBasics, auth.GenesisAccountIterator{}), // AddGenesisAccountCmd allows users to add accounts to the genesis file AddGenesisAccountCmd(ctx, cdc, app.DefaultNodeHome, app.DefaultCLIHome), flags.NewCompletionCmd(rootCmd, true), ) // Tendermint node base commands server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators) // prepare and add flags executor := cli.PrepareBaseCmd(rootCmd, "EM", app.DefaultNodeHome) rootCmd.PersistentFlags().UintVar(&invCheckPeriod, flagInvCheckPeriod, 0, "Assert registered invariants every N blocks") err := executor.Execute() if err != nil { panic(err) } } func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer) abci.Application { return app.NewEthermintApp( logger, db, traceStore, true, map[int64]bool{}, 0, baseapp.SetPruning(storetypes.NewPruningOptionsFromString(viper.GetString("pruning"))), baseapp.SetMinGasPrices(viper.GetString(server.FlagMinGasPrices)), baseapp.SetHaltHeight(uint64(viper.GetInt(server.FlagHaltHeight))), ) } func exportAppStateAndTMValidators( logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailWhiteList []string, ) (json.RawMessage, []tmtypes.GenesisValidator, error) { var ethermintApp *app.EthermintApp if height != -1 { ethermintApp = app.NewEthermintApp(logger, db, traceStore, false, map[int64]bool{}, 0) if err := ethermintApp.LoadHeight(height); err != nil { return nil, nil, err } } else { ethermintApp = app.NewEthermintApp(logger, db, traceStore, true, map[int64]bool{}, 0) } return ethermintApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList) }