package main import ( "errors" "io" "os" cmtcfg "github.com/cometbft/cometbft/config" dbm "github.com/cosmos/cosmos-db" "github.com/spf13/cast" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/sonr-io/sonr/app" util "github.com/sonr-io/sonr/app/commands" didcli "github.com/sonr-io/sonr/x/did/client/cli" dwncli "github.com/sonr-io/sonr/x/dwn/client/cli" "cosmossdk.io/log" confixcmd "cosmossdk.io/tools/confix/cmd" cmtcli "github.com/cometbft/cometbft/libs/cli" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/debug" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/pruning" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/client/snapshot" "github.com/cosmos/cosmos-sdk/server" serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" evmosserverconfig "github.com/cosmos/evm/server/config" evmoscmd "github.com/cosmos/evm/client" evmosserver "github.com/cosmos/evm/server" srvflags "github.com/cosmos/evm/server/flags" ) // AddCustomCommands adds custom commands to the root command func AddCustomCommands(rootCmd *cobra.Command) { didcli.AddAuthCmds(rootCmd) dwncli.AddWalletCmds(rootCmd) rootCmd.AddCommand(util.GovCmd()) // Add VRF keys management to keys command keysCmd := findKeysCommand(rootCmd) if keysCmd != nil { keysCmd.AddCommand(util.VRFKeysCmd()) } } // findKeysCommand finds the keys command in the root command func findKeysCommand(rootCmd *cobra.Command) *cobra.Command { for _, cmd := range rootCmd.Commands() { if cmd.Name() == "keys" { return cmd } } return nil } // initCometBFTConfig helps to override default CometBFT Config values. // return cmtcfg.DefaultConfig if no custom configuration is required for the application. func initCometBFTConfig() *cmtcfg.Config { cfg := cmtcfg.DefaultConfig() // these values put a higher strain on node memory // cfg.P2P.MaxNumInboundPeers = 100 // cfg.P2P.MaxNumOutboundPeers = 40 return cfg } type CustomAppConfig struct { serverconfig.Config EVM evmosserverconfig.EVMConfig JSONRPC evmosserverconfig.JSONRPCConfig TLS evmosserverconfig.TLSConfig } // initAppConfig helps to override default appConfig template and configs. // return "", nil if no custom configuration is required for the application. func initAppConfig() (string, any) { // The following code snippet is just for reference. // Optionally allow the chain developer to overwrite the SDK's default // server config. srvCfg := serverconfig.DefaultConfig() // The SDK's default minimum gas price is set to "" (empty value) inside // app.toml. If left empty by validators, the node will halt on startup. // However, the chain developer can set a default app.toml value for their // validators here. // // In summary: // - if you leave srvCfg.MinGasPrices = "", all validators MUST tweak their // own app.toml config, // - if you set srvCfg.MinGasPrices non-empty, validators CAN tweak their // own app.toml to override, or use this default value. // // In simapp, we set the min gas prices to 0. srvCfg.MinGasPrices = "0stake" // srvCfg.BaseConfig.IAVLDisableFastNode = true // disable fastnode by default customAppConfig := CustomAppConfig{ Config: *srvCfg, EVM: *evmosserverconfig.DefaultEVMConfig(), JSONRPC: *evmosserverconfig.DefaultJSONRPCConfig(), TLS: *evmosserverconfig.DefaultTLSConfig(), } customAppTemplate := serverconfig.DefaultConfigTemplate customAppTemplate += evmosserverconfig.DefaultEVMConfigTemplate return customAppTemplate, customAppConfig } func initRootCmd( rootCmd *cobra.Command, chainApp *app.ChainApp, ) { cfg := sdk.GetConfig() cfg.Seal() rootCmd.AddCommand( util.EnhancedInit(chainApp), genutilcli.Commands(chainApp.TxConfig(), chainApp.BasicModuleManager, app.DefaultNodeHome), cmtcli.NewCompletionCmd(rootCmd, true), debug.Cmd(), confixcmd.ConfigCommand(), pruning.Cmd(newApp, app.DefaultNodeHome), snapshot.Cmd(newApp), ) // add EVM' flavored TM commands to start server, etc. evmosserver.AddCommands( rootCmd, evmosserver.NewDefaultStartOptions(newApp, app.DefaultNodeHome), appExport, addModuleInitFlags, ) // add EVM key commands rootCmd.AddCommand( evmoscmd.KeyCommands(app.DefaultNodeHome, true), ) // add keybase, auxiliary RPC, query, genesis, and tx child commands rootCmd.AddCommand( server.StatusCommand(), queryCommand(), txCommand(), ) // add general tx flags to the root command _, err := srvflags.AddTxFlags(rootCmd) if err != nil { panic(err) } // Add custom commands AddCustomCommands(rootCmd) } func addModuleInitFlags(startCmd *cobra.Command) { crisis.AddModuleInitFlags(startCmd) } func queryCommand() *cobra.Command { cmd := &cobra.Command{ Use: "query", Aliases: []string{"q"}, Short: "Querying subcommands", DisableFlagParsing: false, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } cmd.AddCommand( rpc.QueryEventForTxCmd(), rpc.ValidatorCommand(), authcmd.QueryTxsByEventsCmd(), authcmd.QueryTxCmd(), server.QueryBlocksCmd(), server.QueryBlockResultsCmd(), ) cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") return cmd } func txCommand() *cobra.Command { cmd := &cobra.Command{ Use: "tx", Short: "Transactions subcommands", DisableFlagParsing: false, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } cmd.AddCommand( authcmd.GetSignCommand(), authcmd.GetSignBatchCommand(), authcmd.GetMultiSignCommand(), authcmd.GetMultiSignBatchCmd(), authcmd.GetValidateSignaturesCommand(), authcmd.GetBroadcastCommand(), authcmd.GetEncodeCommand(), authcmd.GetDecodeCommand(), authcmd.GetSimulateCmd(), ) cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID") return cmd } // newApp creates the application func newApp( logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions, ) servertypes.Application { baseappOptions := server.DefaultBaseappOptions(appOpts) if cast.ToBool(appOpts.Get("telemetry.enabled")) { // TODO: Implement telemetry configuration // This should set up telemetry options such as: // - Metrics collection endpoints // - Sampling rates // - Export intervals // - Custom labels and tags // Consider using baseappOptions.SetTelemetry() or similar } return app.NewChainApp( logger, db, traceStore, true, appOpts, app.EVMAppOptions, baseappOptions..., ) } func appExport( logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, appOpts servertypes.AppOptions, modulesToExport []string, ) (servertypes.ExportedApp, error) { var chainApp *app.ChainApp // this check is necessary as we use the flag in x/upgrade. // we can exit more gracefully by checking the flag here. homePath, ok := appOpts.Get(flags.FlagHome).(string) if !ok || homePath == "" { return servertypes.ExportedApp{}, errors.New("application home is not set") } viperAppOpts, ok := appOpts.(*viper.Viper) if !ok { return servertypes.ExportedApp{}, errors.New("appOpts is not viper.Viper") } // overwrite the FlagInvCheckPeriod viperAppOpts.Set(server.FlagInvCheckPeriod, 1) appOpts = viperAppOpts chainApp = app.NewChainApp( logger, db, traceStore, height == -1, appOpts, app.EVMAppOptions, ) if height != -1 { if err := chainApp.LoadHeight(height); err != nil { return servertypes.ExportedApp{}, err } } return chainApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) } var tempDir = func() string { dir, err := os.MkdirTemp("", "simd") if err != nil { panic("failed to create temp dir: " + err.Error()) } defer os.RemoveAll(dir) return dir }