package app import ( "io" "net/http" upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/bze-alphateam/bze/app/upgrades" v810 "github.com/bze-alphateam/bze/app/upgrades/v810" v811 "github.com/bze-alphateam/bze/app/upgrades/v811" v820 "github.com/bze-alphateam/bze/app/upgrades/v820" "github.com/cosmos/cosmos-sdk/x/auth/ante" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" epochmoduletypes "github.com/bze-alphateam/bze/x/epochs/types" _ "cosmossdk.io/api/cosmos/tx/config/v1" // import for side-effects clienthelpers "cosmossdk.io/client/v2/helpers" "cosmossdk.io/depinject" "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" _ "cosmossdk.io/x/circuit" // import for side-effects circuitkeeper "cosmossdk.io/x/circuit/keeper" _ "cosmossdk.io/x/evidence" // import for side-effects evidencekeeper "cosmossdk.io/x/evidence/keeper" feegrantkeeper "cosmossdk.io/x/feegrant/keeper" _ "cosmossdk.io/x/feegrant/module" // import for side-effects nftkeeper "cosmossdk.io/x/nft/keeper" _ "cosmossdk.io/x/nft/module" // import for side-effects _ "cosmossdk.io/x/upgrade" // import for side-effects upgradekeeper "cosmossdk.io/x/upgrade/keeper" abci "github.com/cometbft/cometbft/abci/types" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import for side-effects authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" _ "github.com/cosmos/cosmos-sdk/x/auth/vesting" // import for side-effects authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" _ "github.com/cosmos/cosmos-sdk/x/authz/module" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/bank" // import for side-effects bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" _ "github.com/cosmos/cosmos-sdk/x/consensus" // import for side-effects consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" _ "github.com/cosmos/cosmos-sdk/x/distribution" // import for side-effects distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/gov" govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" _ "github.com/cosmos/cosmos-sdk/x/group/module" // import for side-effects _ "github.com/cosmos/cosmos-sdk/x/mint" // import for side-effects mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" _ "github.com/cosmos/cosmos-sdk/x/params" // import for side-effects paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" _ "github.com/cosmos/cosmos-sdk/x/slashing" // import for side-effects slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" _ "github.com/cosmos/cosmos-sdk/x/staking" // import for side-effects stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" _ "github.com/cosmos/ibc-go/modules/capability" // import for side-effects capabilitykeeper "github.com/cosmos/ibc-go/modules/capability/keeper" _ "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts" // import for side-effects icacontrollerkeeper "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/controller/keeper" icahostkeeper "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/host/keeper" _ "github.com/cosmos/ibc-go/v8/modules/apps/29-fee" // import for side-effects ibcfeekeeper "github.com/cosmos/ibc-go/v8/modules/apps/29-fee/keeper" ibctransferkeeper "github.com/cosmos/ibc-go/v8/modules/apps/transfer/keeper" ibckeeper "github.com/cosmos/ibc-go/v8/modules/core/keeper" burnermodulekeeper "github.com/bze-alphateam/bze/x/burner/keeper" cointrunkmodulekeeper "github.com/bze-alphateam/bze/x/cointrunk/keeper" epochmodulekeeper "github.com/bze-alphateam/bze/x/epochs/keeper" rewardsmodulekeeper "github.com/bze-alphateam/bze/x/rewards/keeper" tokenfactorymodulekeeper "github.com/bze-alphateam/bze/x/tokenfactory/keeper" tradebinmodulekeeper "github.com/bze-alphateam/bze/x/tradebin/keeper" tradebintypes "github.com/bze-alphateam/bze/x/tradebin/types" _ "github.com/bze-alphateam/bze/client/docs/statik" txfeecollectormodulekeeper "github.com/bze-alphateam/bze/x/txfeecollector/keeper" // this line is used by starport scaffolding # stargate/app/moduleImport ) const ( AccountAddressPrefix = "bze" Name = "bze" ) var ( // DefaultNodeHome default home directories for the application daemon DefaultNodeHome string ) var ( _ runtime.AppI = (*App)(nil) _ servertypes.Application = (*App)(nil) ) // App extends an ABCI application, but with most of its parameters exported. // They are exported for convenience in creating helper functions, as object // capabilities aren't needed for testing. type App struct { *runtime.App legacyAmino *codec.LegacyAmino appCodec codec.Codec txConfig client.TxConfig interfaceRegistry codectypes.InterfaceRegistry // keepers AccountKeeper authkeeper.AccountKeeper BankKeeper bankkeeper.Keeper StakingKeeper *stakingkeeper.Keeper DistrKeeper distrkeeper.Keeper ConsensusParamsKeeper consensuskeeper.Keeper SlashingKeeper slashingkeeper.Keeper MintKeeper mintkeeper.Keeper GovKeeper *govkeeper.Keeper UpgradeKeeper *upgradekeeper.Keeper ParamsKeeper paramskeeper.Keeper AuthzKeeper authzkeeper.Keeper EvidenceKeeper evidencekeeper.Keeper FeeGrantKeeper feegrantkeeper.Keeper GroupKeeper groupkeeper.Keeper NFTKeeper nftkeeper.Keeper CircuitBreakerKeeper circuitkeeper.Keeper // IBC IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly CapabilityKeeper *capabilitykeeper.Keeper IBCFeeKeeper ibcfeekeeper.Keeper ICAControllerKeeper icacontrollerkeeper.Keeper ICAHostKeeper icahostkeeper.Keeper TransferKeeper ibctransferkeeper.Keeper // Scoped IBC ScopedIBCKeeper capabilitykeeper.ScopedKeeper ScopedIBCTransferKeeper capabilitykeeper.ScopedKeeper ScopedICAControllerKeeper capabilitykeeper.ScopedKeeper ScopedICAHostKeeper capabilitykeeper.ScopedKeeper ScopedKeepers map[string]capabilitykeeper.ScopedKeeper BurnerKeeper burnermodulekeeper.Keeper EpochKeeper *epochmodulekeeper.Keeper CointrunkKeeper cointrunkmodulekeeper.Keeper TokenfactoryKeeper tokenfactorymodulekeeper.Keeper RewardsKeeper *rewardsmodulekeeper.Keeper TradebinKeeper *tradebinmodulekeeper.Keeper TxfeecollectorKeeper *txfeecollectormodulekeeper.Keeper // this line is used by starport scaffolding # stargate/app/keeperDeclaration // simulation manager sm *module.SimulationManager } func init() { var err error clienthelpers.EnvPrefix = Name DefaultNodeHome, err = clienthelpers.GetNodeHomeDirectory("." + Name) if err != nil { panic(err) } } // getGovProposalHandlers return the chain proposal handlers. func getGovProposalHandlers() []govclient.ProposalHandler { var govProposalHandlers []govclient.ProposalHandler // this line is used by starport scaffolding # stargate/app/govProposalHandlers govProposalHandlers = append(govProposalHandlers, paramsclient.ProposalHandler, // this line is used by starport scaffolding # stargate/app/govProposalHandler ) return govProposalHandlers } // AppConfig returns the default app config. func AppConfig() depinject.Config { return depinject.Configs( appConfig, // Alternatively, load the app config from a YAML file. // appconfig.LoadYAML(AppConfigYAML), depinject.Supply( // supply custom module basics map[string]module.AppModuleBasic{ genutiltypes.ModuleName: genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), govtypes.ModuleName: gov.NewAppModuleBasic(getGovProposalHandlers()), // this line is used by starport scaffolding # stargate/appConfig/moduleBasic }, ), ) } // New returns a reference to an initialized App. func New( logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) (*App, error) { var ( app = &App{ScopedKeepers: make(map[string]capabilitykeeper.ScopedKeeper)} appBuilder *runtime.AppBuilder // merge the AppConfig and other configuration in one config appConfig = depinject.Configs( AppConfig(), depinject.Supply( appOpts, // supply app options logger, // supply logger // Supply with IBC keeper getter for the IBC modules with App Wiring. // The IBC Keeper cannot be passed because it has not been initiated yet. // Passing the getter, the app IBC Keeper will always be accessible. // This needs to be removed after IBC supports App Wiring. app.GetIBCKeeper, app.GetCapabilityScopedKeeper, // here alternative options can be supplied to the DI container. // those options can be used f.e to override the default behavior of some modules. // for instance supplying a custom address codec for not using bech32 addresses. // read the depinject documentation and depinject module wiring for more information // on available options and how to use them. ), ) ) if err := depinject.Inject(appConfig, &appBuilder, &app.appCodec, &app.legacyAmino, &app.txConfig, &app.interfaceRegistry, &app.AccountKeeper, &app.BankKeeper, &app.StakingKeeper, &app.DistrKeeper, &app.ConsensusParamsKeeper, &app.SlashingKeeper, &app.MintKeeper, &app.GovKeeper, &app.UpgradeKeeper, &app.ParamsKeeper, &app.AuthzKeeper, &app.EvidenceKeeper, &app.FeeGrantKeeper, &app.NFTKeeper, &app.GroupKeeper, &app.CircuitBreakerKeeper, &app.BurnerKeeper, &app.EpochKeeper, &app.CointrunkKeeper, &app.TokenfactoryKeeper, &app.RewardsKeeper, &app.TradebinKeeper, &app.TxfeecollectorKeeper, // this line is used by starport scaffolding # stargate/app/keeperDefinition ); err != nil { panic(err) } // add to default baseapp options // enable optimistic execution baseAppOptions = append(baseAppOptions, baseapp.SetOptimisticExecution()) // build app app.App = appBuilder.Build(db, traceStore, baseAppOptions...) // register legacy modules if err := app.registerIBCModules(appOpts); err != nil { return nil, err } // register streaming services if err := app.RegisterStreamingServices(appOpts, app.kvStoreKeys()); err != nil { return nil, err } // create the simulation manager and define the order of the modules for deterministic simulations overrideModules := map[string]module.AppModuleSimulation{ authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), } app.sm = module.NewSimulationManagerFromAppModules(app.ModuleManager.Modules, overrideModules) app.sm.RegisterStoreDecoders() app.setEpochsHooks() app.setTradebinHooks() app.setupUpgradeHandlers() anteOptions := ante.HandlerOptions{ AccountKeeper: app.AccountKeeper, BankKeeper: app.BankKeeper, FeegrantKeeper: app.FeeGrantKeeper, SignModeHandler: app.txConfig.SignModeHandler(), SigGasConsumer: ante.DefaultSigVerificationGasConsumer, } customAnte := AnteHandlerOptions{ TradeKeeper: app.TradebinKeeper, BankKeeper: app.BankKeeper, TxCollectorKeeper: app.TxfeecollectorKeeper, } anteHandler, err := NewAnteHandler(anteOptions, customAnte) if err != nil { return nil, err } app.SetAnteHandler(anteHandler) // A custom InitChainer sets if extra pre-init-genesis logic is required. // This is necessary for manually registered modules that do not support app wiring. // Manually set the module version map as shown below. // The upgrade module will automatically handle de-duplication of the module version map. app.SetInitChainer(func(ctx sdk.Context, req *abci.RequestInitChain) (*abci.ResponseInitChain, error) { if err := app.UpgradeKeeper.SetModuleVersionMap(ctx, app.ModuleManager.GetVersionMap()); err != nil { return nil, err } return app.App.InitChainer(ctx, req) }) if err := app.Load(loadLatest); err != nil { return nil, err } return app, nil } func (app *App) setupUpgradeHandlers() { app.UpgradeKeeper.SetUpgradeHandler( v810.UpgradeName, v810.CreateUpgradeHandler( app.Configurator(), app.ModuleManager, ), ) // v8.1.1 only changes LP denom derivation for new pools: no migrations, no store changes app.UpgradeKeeper.SetUpgradeHandler( v811.UpgradeName, upgrades.EmptyUpgradeHandler(), ) // v8.2.0 runs module migrations (rewards v4->v5: Denom Rewards param defaults, // txfeecollector v2->v3: empty BlockedIbcInbound default) and then the Noble USDC // wind-down; no store keys are added or removed, so no store loader entry is needed app.UpgradeKeeper.SetUpgradeHandler( v820.UpgradeName, v820.CreateUpgradeHandler( app.Configurator(), app.ModuleManager, app.BankKeeper, app.AccountKeeper, app.TxfeecollectorKeeper, ), ) upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() if err != nil { panic(err) } if upgradeInfo.Name == v810.UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { storeUpgrades := v810.GetStoreUpgrades() app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, storeUpgrades)) } } // LegacyAmino returns App's amino codec. // // NOTE: This is solely to be used for testing purposes as it may be desirable // for modules to register their own custom testing types. func (app *App) LegacyAmino() *codec.LegacyAmino { return app.legacyAmino } // AppCodec returns App's app codec. // // NOTE: This is solely to be used for testing purposes as it may be desirable // for modules to register their own custom testing types. func (app *App) AppCodec() codec.Codec { return app.appCodec } // InterfaceRegistry returns App's interfaceRegistry. func (app *App) InterfaceRegistry() codectypes.InterfaceRegistry { return app.interfaceRegistry } // TxConfig returns App's tx config. func (app *App) TxConfig() client.TxConfig { return app.txConfig } // GetKey returns the KVStoreKey for the provided store key. func (app *App) GetKey(storeKey string) *storetypes.KVStoreKey { kvStoreKey, ok := app.UnsafeFindStoreKey(storeKey).(*storetypes.KVStoreKey) if !ok { return nil } return kvStoreKey } // GetMemKey returns the MemoryStoreKey for the provided store key. func (app *App) GetMemKey(storeKey string) *storetypes.MemoryStoreKey { key, ok := app.UnsafeFindStoreKey(storeKey).(*storetypes.MemoryStoreKey) if !ok { return nil } return key } // kvStoreKeys returns all the kv store keys registered inside App. func (app *App) kvStoreKeys() map[string]*storetypes.KVStoreKey { keys := make(map[string]*storetypes.KVStoreKey) for _, k := range app.GetStoreKeys() { if kv, ok := k.(*storetypes.KVStoreKey); ok { keys[kv.Name()] = kv } } return keys } // GetSubspace returns a param subspace for a given module name. func (app *App) GetSubspace(moduleName string) paramstypes.Subspace { subspace, _ := app.ParamsKeeper.GetSubspace(moduleName) return subspace } // GetIBCKeeper returns the IBC keeper. func (app *App) GetIBCKeeper() *ibckeeper.Keeper { return app.IBCKeeper } // GetCapabilityScopedKeeper returns the capability scoped keeper. func (app *App) GetCapabilityScopedKeeper(moduleName string) capabilitykeeper.ScopedKeeper { sk, ok := app.ScopedKeepers[moduleName] if !ok { sk = app.CapabilityKeeper.ScopeToModule(moduleName) app.ScopedKeepers[moduleName] = sk } return sk } // SimulationManager implements the SimulationApp interface. func (app *App) SimulationManager() *module.SimulationManager { return app.sm } // RegisterAPIRoutes registers all application module routes with the provided // API server. func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { app.App.RegisterAPIRoutes(apiSvr, apiConfig) // register swagger API in app.go so that other applications can override easily if apiConfig.Swagger { RegisterSwaggerAPI(apiSvr.ClientCtx, apiSvr.Router) } } // RegisterSwaggerAPI registers swagger route with API Server. func RegisterSwaggerAPI(_ client.Context, rtr *mux.Router) { statikFS, err := fs.New() if err != nil { panic(err) } staticServer := http.FileServer(statikFS) rtr.PathPrefix("/static/").Handler(http.StripPrefix("/static/", staticServer)) rtr.PathPrefix("/swagger/").Handler(staticServer) } // setEpochsHooks sets up the hooks for the EpochKeeper by adding specific hooks from other keepers. func (app *App) setEpochsHooks() { app.EpochKeeper.SetHooks( []epochmoduletypes.EpochHook{ app.RewardsKeeper.GetDistributeAllStakingRewardsHook(), app.RewardsKeeper.GetUnlockPendingUnlockParticipantsHook(), app.RewardsKeeper.GetRemoveExpiredPendingTradingRewardsHook(), app.RewardsKeeper.GetTradingRewardsDistributionHook(), app.RewardsKeeper.GetDenomRewardsDistributionHook(), app.BurnerKeeper.GetBurnerRaffleCleanupHook(), app.BurnerKeeper.GetBurnerPeriodicBurnHook(), }, ) } func (app *App) setTradebinHooks() { app.TradebinKeeper.SetOnOrderFillHooks( []tradebintypes.OnMarketOrderFill{ app.RewardsKeeper.GetOnOrderFillHook(), }, ) } // GetMaccPerms returns a copy of the module account permissions // // NOTE: This is solely to be used for testing purposes. func GetMaccPerms() map[string][]string { dup := make(map[string][]string) for _, perms := range moduleAccPerms { dup[perms.Account] = perms.Permissions } return dup } // BlockedAddresses returns all the app's blocked account addresses. func BlockedAddresses() map[string]bool { result := make(map[string]bool) if len(blockAccAddrs) > 0 { for _, addr := range blockAccAddrs { result[addr] = true } } else { for addr := range GetMaccPerms() { result[addr] = true } } return result }