github.com/KiraCore/sekai@v0.3.43/app/app.go (about)

     1  package app
     2  
     3  import (
     4  	"io"
     5  	"net/http"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	customante "github.com/KiraCore/sekai/app/ante"
    10  	posthandler "github.com/KiraCore/sekai/app/posthandler"
    11  	"github.com/KiraCore/sekai/x/basket"
    12  	basketkeeper "github.com/KiraCore/sekai/x/basket/keeper"
    13  	baskettypes "github.com/KiraCore/sekai/x/basket/types"
    14  	"github.com/KiraCore/sekai/x/collectives"
    15  	collectiveskeeper "github.com/KiraCore/sekai/x/collectives/keeper"
    16  	collectivestypes "github.com/KiraCore/sekai/x/collectives/types"
    17  	"github.com/KiraCore/sekai/x/custody"
    18  	custodykeeper "github.com/KiraCore/sekai/x/custody/keeper"
    19  	custodytypes "github.com/KiraCore/sekai/x/custody/types"
    20  	"github.com/KiraCore/sekai/x/distributor"
    21  	distributorkeeper "github.com/KiraCore/sekai/x/distributor/keeper"
    22  	distributortypes "github.com/KiraCore/sekai/x/distributor/types"
    23  	"github.com/KiraCore/sekai/x/evidence"
    24  	evidencekeeper "github.com/KiraCore/sekai/x/evidence/keeper"
    25  	evidencetypes "github.com/KiraCore/sekai/x/evidence/types"
    26  	"github.com/KiraCore/sekai/x/feeprocessing"
    27  	feeprocessingkeeper "github.com/KiraCore/sekai/x/feeprocessing/keeper"
    28  	feeprocessingtypes "github.com/KiraCore/sekai/x/feeprocessing/types"
    29  	"github.com/KiraCore/sekai/x/genutil"
    30  	genutiltypes "github.com/KiraCore/sekai/x/genutil/types"
    31  	customgov "github.com/KiraCore/sekai/x/gov"
    32  	customgovkeeper "github.com/KiraCore/sekai/x/gov/keeper"
    33  	govtypes "github.com/KiraCore/sekai/x/gov/types"
    34  	"github.com/KiraCore/sekai/x/layer2"
    35  	layer2keeper "github.com/KiraCore/sekai/x/layer2/keeper"
    36  	layer2types "github.com/KiraCore/sekai/x/layer2/types"
    37  	"github.com/KiraCore/sekai/x/multistaking"
    38  	multistakingkeeper "github.com/KiraCore/sekai/x/multistaking/keeper"
    39  	multistakingtypes "github.com/KiraCore/sekai/x/multistaking/types"
    40  	recovery "github.com/KiraCore/sekai/x/recovery"
    41  	recoverykeeper "github.com/KiraCore/sekai/x/recovery/keeper"
    42  	recoverytypes "github.com/KiraCore/sekai/x/recovery/types"
    43  	customslashing "github.com/KiraCore/sekai/x/slashing"
    44  	customslashingkeeper "github.com/KiraCore/sekai/x/slashing/keeper"
    45  	slashingtypes "github.com/KiraCore/sekai/x/slashing/types"
    46  	"github.com/KiraCore/sekai/x/spending"
    47  	spendingkeeper "github.com/KiraCore/sekai/x/spending/keeper"
    48  	spendingtypes "github.com/KiraCore/sekai/x/spending/types"
    49  	customstaking "github.com/KiraCore/sekai/x/staking"
    50  	customstakingkeeper "github.com/KiraCore/sekai/x/staking/keeper"
    51  	stakingtypes "github.com/KiraCore/sekai/x/staking/types"
    52  	"github.com/KiraCore/sekai/x/tokens"
    53  	tokenskeeper "github.com/KiraCore/sekai/x/tokens/keeper"
    54  	tokenstypes "github.com/KiraCore/sekai/x/tokens/types"
    55  	"github.com/KiraCore/sekai/x/ubi"
    56  	ubikeeper "github.com/KiraCore/sekai/x/ubi/keeper"
    57  	ubitypes "github.com/KiraCore/sekai/x/ubi/types"
    58  	"github.com/KiraCore/sekai/x/upgrade"
    59  	upgradekeeper "github.com/KiraCore/sekai/x/upgrade/keeper"
    60  	upgradetypes "github.com/KiraCore/sekai/x/upgrade/types"
    61  	dbm "github.com/cometbft/cometbft-db"
    62  	abci "github.com/cometbft/cometbft/abci/types"
    63  	"github.com/cometbft/cometbft/libs/log"
    64  	tmos "github.com/cometbft/cometbft/libs/os"
    65  	bam "github.com/cosmos/cosmos-sdk/baseapp"
    66  	"github.com/cosmos/cosmos-sdk/client"
    67  	nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node"
    68  	"github.com/cosmos/cosmos-sdk/client/grpc/tmservice"
    69  	"github.com/cosmos/cosmos-sdk/codec"
    70  	"github.com/cosmos/cosmos-sdk/codec/types"
    71  	"github.com/cosmos/cosmos-sdk/server"
    72  	"github.com/cosmos/cosmos-sdk/server/api"
    73  	"github.com/cosmos/cosmos-sdk/server/config"
    74  	servertypes "github.com/cosmos/cosmos-sdk/server/types"
    75  	storetypes "github.com/cosmos/cosmos-sdk/store/types"
    76  	"github.com/cosmos/cosmos-sdk/testutil/testdata"
    77  	sdk "github.com/cosmos/cosmos-sdk/types"
    78  	"github.com/cosmos/cosmos-sdk/types/module"
    79  	"github.com/cosmos/cosmos-sdk/version"
    80  	"github.com/cosmos/cosmos-sdk/x/auth"
    81  	"github.com/cosmos/cosmos-sdk/x/auth/ante"
    82  	authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
    83  	authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation"
    84  	authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"
    85  	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
    86  	"github.com/cosmos/cosmos-sdk/x/bank"
    87  	bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
    88  	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
    89  	consensus "github.com/cosmos/cosmos-sdk/x/consensus"
    90  	consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper"
    91  	consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types"
    92  	minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
    93  	"github.com/cosmos/cosmos-sdk/x/params"
    94  	paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
    95  	paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
    96  	"github.com/gorilla/mux"
    97  	"github.com/rakyll/statik/fs"
    98  )
    99  
   100  const appName = "Sekai"
   101  
   102  var (
   103  	// DefaultNodeHome default home directories for the application daemon
   104  	DefaultNodeHome string
   105  
   106  	// ModuleBasics defines the module BasicManager is in charge of setting up basic,
   107  	// non-dependant module elements, such as codec registration
   108  	// and genesis verification.
   109  	ModuleBasics = module.NewBasicManager(
   110  		auth.AppModuleBasic{},
   111  		genutil.AppModuleBasic{},
   112  		bank.AppModuleBasic{},
   113  		params.AppModuleBasic{},
   114  		upgrade.AppModuleBasic{},
   115  		customslashing.AppModuleBasic{},
   116  		recovery.AppModuleBasic{},
   117  		customstaking.AppModuleBasic{},
   118  		customgov.AppModuleBasic{},
   119  		spending.AppModuleBasic{},
   120  		distributor.AppModuleBasic{},
   121  		basket.AppModuleBasic{},
   122  		ubi.AppModuleBasic{},
   123  		evidence.AppModuleBasic{},
   124  		tokens.AppModuleBasic{},
   125  		feeprocessing.AppModuleBasic{},
   126  		custody.AppModuleBasic{},
   127  		multistaking.AppModuleBasic{},
   128  		collectives.AppModuleBasic{},
   129  		layer2.AppModuleBasic{},
   130  		consensus.AppModuleBasic{},
   131  	)
   132  
   133  	// module account permissions
   134  	maccPerms = map[string][]string{
   135  		authtypes.FeeCollectorName:   nil,
   136  		govtypes.ModuleName:          nil,
   137  		minttypes.ModuleName:         {authtypes.Minter},
   138  		spendingtypes.ModuleName:     nil,
   139  		distributortypes.ModuleName:  nil,
   140  		baskettypes.ModuleName:       {authtypes.Minter, authtypes.Burner},
   141  		multistakingtypes.ModuleName: {authtypes.Burner},
   142  		collectivestypes.ModuleName:  nil,
   143  		layer2types.ModuleName:       {authtypes.Minter, authtypes.Burner},
   144  		recoverytypes.ModuleName:     {authtypes.Minter, authtypes.Burner},
   145  	}
   146  
   147  	// module accounts that are allowed to receive tokens
   148  	allowedReceivingModAcc = map[string]bool{}
   149  )
   150  
   151  // NewApp extended ABCI application
   152  type SekaiApp struct {
   153  	*bam.BaseApp
   154  	cdc               *codec.LegacyAmino
   155  	appCodec          codec.Codec
   156  	interfaceRegistry types.InterfaceRegistry
   157  
   158  	invCheckPeriod uint
   159  
   160  	// keys to access the substores
   161  	keys    map[string]*storetypes.KVStoreKey
   162  	tKeys   map[string]*storetypes.TransientStoreKey
   163  	memKeys map[string]*storetypes.MemoryStoreKey
   164  
   165  	// keepers
   166  	AccountKeeper authkeeper.AccountKeeper
   167  	BankKeeper    bankkeeper.Keeper
   168  	UpgradeKeeper upgradekeeper.Keeper
   169  	ParamsKeeper  paramskeeper.Keeper
   170  
   171  	CustodyKeeper         custodykeeper.Keeper
   172  	CustomGovKeeper       customgovkeeper.Keeper
   173  	CustomStakingKeeper   customstakingkeeper.Keeper
   174  	CustomSlashingKeeper  customslashingkeeper.Keeper
   175  	RecoveryKeeper        recoverykeeper.Keeper
   176  	TokensKeeper          tokenskeeper.Keeper
   177  	FeeProcessingKeeper   feeprocessingkeeper.Keeper
   178  	EvidenceKeeper        evidencekeeper.Keeper
   179  	SpendingKeeper        spendingkeeper.Keeper
   180  	UbiKeeper             ubikeeper.Keeper
   181  	DistrKeeper           distributorkeeper.Keeper
   182  	BasketKeeper          basketkeeper.Keeper
   183  	MultiStakingKeeper    multistakingkeeper.Keeper
   184  	CollectivesKeeper     collectiveskeeper.Keeper
   185  	Layer2Keeper          layer2keeper.Keeper
   186  	ConsensusParamsKeeper consensusparamkeeper.Keeper
   187  
   188  	// Module Manager
   189  	mm *module.Manager
   190  
   191  	// simulation manager
   192  	sm *module.SimulationManager
   193  }
   194  
   195  func init() {
   196  	userHomeDir, err := os.UserHomeDir()
   197  	if err != nil {
   198  		panic(err)
   199  	}
   200  
   201  	DefaultNodeHome = filepath.Join(userHomeDir, ".sekaid")
   202  }
   203  
   204  // NewInitApp returns a reference to an initialized App.
   205  func NewInitApp(
   206  	logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, skipUpgradeHeights map[int64]bool,
   207  	homePath string, invCheckPeriod uint, encodingConfig EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*bam.BaseApp),
   208  ) *SekaiApp {
   209  	appCodec := encodingConfig.Marshaler
   210  	cdc := encodingConfig.Amino
   211  	interfaceRegistry := encodingConfig.InterfaceRegistry
   212  
   213  	// BaseApp handles interactions with Tendermint through the ABCI protocol
   214  	bApp := bam.NewBaseApp(appName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...)
   215  	bApp.SetCommitMultiStoreTracer(traceStore)
   216  	bApp.SetVersion(version.Version)
   217  	bApp.SetInterfaceRegistry(interfaceRegistry)
   218  
   219  	keys := sdk.NewKVStoreKeys(
   220  		authtypes.StoreKey,
   221  		banktypes.StoreKey,
   222  		paramstypes.StoreKey,
   223  		upgradetypes.StoreKey,
   224  		recoverytypes.ModuleName,
   225  		slashingtypes.ModuleName,
   226  		stakingtypes.ModuleName,
   227  		govtypes.ModuleName,
   228  		spendingtypes.ModuleName,
   229  		distributortypes.ModuleName,
   230  		baskettypes.ModuleName,
   231  		multistakingtypes.ModuleName,
   232  		ubitypes.ModuleName,
   233  		tokenstypes.ModuleName,
   234  		feeprocessingtypes.ModuleName,
   235  		evidencetypes.StoreKey,
   236  		custodytypes.StoreKey,
   237  		collectivestypes.ModuleName,
   238  		layer2types.ModuleName,
   239  		consensusparamtypes.StoreKey,
   240  	)
   241  	tKeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey)
   242  
   243  	// Here you initialize your application with the store keys it requires
   244  	app := &SekaiApp{
   245  		BaseApp:           bApp,
   246  		cdc:               cdc,
   247  		appCodec:          appCodec,
   248  		interfaceRegistry: interfaceRegistry,
   249  		invCheckPeriod:    invCheckPeriod,
   250  		keys:              keys,
   251  		tKeys:             tKeys,
   252  	}
   253  
   254  	app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tKeys[paramstypes.TStoreKey])
   255  
   256  	// set the BaseApp's parameter store
   257  	app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[consensusparamtypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String())
   258  	bApp.SetParamStore(&app.ConsensusParamsKeeper)
   259  
   260  	// The AccountKeeper handles address -> account lookups
   261  	app.AccountKeeper = authkeeper.NewAccountKeeper(appCodec, keys[authtypes.StoreKey], authtypes.ProtoBaseAccount, maccPerms, sdk.Bech32MainPrefix, authtypes.NewModuleAddress(govtypes.ModuleName).String())
   262  
   263  	app.BankKeeper = bankkeeper.NewBaseKeeper(
   264  		appCodec,
   265  		keys[banktypes.StoreKey],
   266  		app.AccountKeeper,
   267  		BlockedAddresses(),
   268  		authtypes.NewModuleAddress(govtypes.ModuleName).String(),
   269  	)
   270  
   271  	app.TokensKeeper = tokenskeeper.NewKeeper(keys[tokenstypes.ModuleName], appCodec)
   272  	app.CustomGovKeeper = customgovkeeper.NewKeeper(keys[govtypes.ModuleName], appCodec, app.BankKeeper)
   273  	customStakingKeeper := customstakingkeeper.NewKeeper(keys[stakingtypes.ModuleName], cdc, app.CustomGovKeeper)
   274  	multiStakingKeeper := multistakingkeeper.NewKeeper(keys[multistakingtypes.ModuleName], appCodec, app.BankKeeper, app.TokensKeeper, app.CustomGovKeeper, customStakingKeeper)
   275  	customSlashingKeeper := customslashingkeeper.NewKeeper(
   276  		appCodec,
   277  		keys[slashingtypes.StoreKey],
   278  		&customStakingKeeper,
   279  		multiStakingKeeper,
   280  		app.CustomGovKeeper,
   281  		app.GetSubspace(slashingtypes.ModuleName),
   282  	)
   283  
   284  	app.BasketKeeper = basketkeeper.NewKeeper(
   285  		keys[baskettypes.ModuleName], appCodec,
   286  		app.AccountKeeper, app.BankKeeper,
   287  		app.CustomGovKeeper,
   288  		app.TokensKeeper,
   289  		multiStakingKeeper,
   290  	)
   291  
   292  	app.CustomSlashingKeeper = *customSlashingKeeper.SetHooks(
   293  		slashingtypes.NewMultiSlashingHooks(app.BasketKeeper.Hooks()),
   294  	)
   295  
   296  	app.SpendingKeeper = spendingkeeper.NewKeeper(keys[spendingtypes.ModuleName], appCodec, app.BankKeeper, app.CustomGovKeeper)
   297  	// NOTE: customStakingKeeper above is passed by reference, so that it will contain these hooks
   298  	app.CustomStakingKeeper = *customStakingKeeper.SetHooks(
   299  		stakingtypes.NewMultiStakingHooks(app.CustomSlashingKeeper.Hooks()),
   300  	)
   301  
   302  	app.CollectivesKeeper = collectiveskeeper.NewKeeper(
   303  		keys[collectivestypes.StoreKey], appCodec,
   304  		app.BankKeeper,
   305  		app.CustomGovKeeper,
   306  		multiStakingKeeper,
   307  		app.TokensKeeper,
   308  		app.SpendingKeeper,
   309  	)
   310  	app.MultiStakingKeeper = *multiStakingKeeper.SetHooks(
   311  		multistakingtypes.NewMultiStakingHooks(app.BasketKeeper.Hooks()),
   312  	)
   313  
   314  	app.Layer2Keeper = layer2keeper.NewKeeper(
   315  		keys[collectivestypes.StoreKey], appCodec,
   316  		app.BankKeeper,
   317  		app.CustomStakingKeeper,
   318  		app.CustomGovKeeper,
   319  		app.SpendingKeeper,
   320  	)
   321  
   322  	app.UpgradeKeeper = upgradekeeper.NewKeeper(keys[upgradetypes.StoreKey], appCodec, app.CustomStakingKeeper)
   323  
   324  	// app.upgradeKeeper.SetUpgradeHandler(
   325  	// 	"upgrade1", func(ctx sdk.Context, plan upgradetypes.Plan) {
   326  	// 	})
   327  
   328  	app.FeeProcessingKeeper = feeprocessingkeeper.NewKeeper(keys[feeprocessingtypes.ModuleName], appCodec, app.BankKeeper, app.TokensKeeper, app.CustomGovKeeper)
   329  
   330  	// create evidence keeper with router
   331  	evidenceKeeper := evidencekeeper.NewKeeper(
   332  		appCodec, keys[evidencetypes.StoreKey], &app.CustomStakingKeeper, app.CustomSlashingKeeper,
   333  	)
   334  	// If evidence needs to be handled for the app, set routes in router here and seal
   335  	app.EvidenceKeeper = *evidenceKeeper
   336  
   337  	app.CustodyKeeper = custodykeeper.NewKeeper(keys[custodytypes.StoreKey], appCodec, app.CustomGovKeeper, app.BankKeeper)
   338  
   339  	app.RecoveryKeeper = recoverykeeper.NewKeeper(
   340  		appCodec,
   341  		keys[slashingtypes.StoreKey],
   342  		app.AccountKeeper,
   343  		app.BankKeeper,
   344  		&customStakingKeeper,
   345  		app.CustomGovKeeper,
   346  		app.MultiStakingKeeper,
   347  		app.CollectivesKeeper,
   348  		app.SpendingKeeper,
   349  		app.CustodyKeeper,
   350  	)
   351  
   352  	app.DistrKeeper = distributorkeeper.NewKeeper(
   353  		keys[distributortypes.ModuleName], appCodec,
   354  		app.AccountKeeper, app.BankKeeper,
   355  		app.CustomStakingKeeper, app.CustomGovKeeper,
   356  		app.MultiStakingKeeper, app.RecoveryKeeper)
   357  	app.MultiStakingKeeper.SetDistrKeeper(app.DistrKeeper)
   358  	app.UbiKeeper = ubikeeper.NewKeeper(keys[ubitypes.ModuleName], appCodec, app.BankKeeper, app.SpendingKeeper, app.DistrKeeper)
   359  
   360  	proposalRouter := govtypes.NewProposalRouter(
   361  		[]govtypes.ProposalHandler{
   362  			customgov.NewApplyWhitelistAccountPermissionProposalHandler(app.CustomGovKeeper),
   363  			customgov.NewApplyBlacklistAccountPermissionProposalHandler(app.CustomGovKeeper),
   364  			customgov.NewApplyRemoveWhitelistedAccountPermissionProposalHandler(app.CustomGovKeeper),
   365  			customgov.NewApplyRemoveBlacklistedAccountPermissionProposalHandler(app.CustomGovKeeper),
   366  			customgov.NewApplyAssignRoleToAccountProposalHandler(app.CustomGovKeeper),
   367  			customgov.NewApplyUnassignRoleFromAccountProposalHandler(app.CustomGovKeeper),
   368  			customgov.NewApplySetNetworkPropertyProposalHandler(app.CustomGovKeeper),
   369  			customgov.NewApplyUpsertDataRegistryProposalHandler(app.CustomGovKeeper),
   370  			customgov.NewApplySetPoorNetworkMessagesProposalHandler(app.CustomGovKeeper),
   371  			customgov.NewApplyResetWholeCouncilorRankProposalHandler(app.CustomGovKeeper),
   372  			customgov.NewApplyJailCouncilorProposalHandler(app.CustomGovKeeper),
   373  			tokens.NewApplyUpsertTokenAliasProposalHandler(app.TokensKeeper),
   374  			tokens.NewApplyUpsertTokenRatesProposalHandler(app.TokensKeeper),
   375  			tokens.NewApplyWhiteBlackChangeProposalHandler(app.TokensKeeper),
   376  			customstaking.NewApplyUnjailValidatorProposalHandler(app.CustomStakingKeeper, app.CustomGovKeeper),
   377  			customslashing.NewApplyResetWholeValidatorRankProposalHandler(app.CustomSlashingKeeper),
   378  			customslashing.NewApplySlashValidatorProposalHandler(app.CustomSlashingKeeper),
   379  			customgov.NewApplyCreateRoleProposalHandler(app.CustomGovKeeper),
   380  			customgov.NewApplyRemoveRoleProposalHandler(app.CustomGovKeeper),
   381  			customgov.NewApplyWhitelistRolePermissionProposalHandler(app.CustomGovKeeper),
   382  			customgov.NewApplyBlacklistRolePermissionProposalHandler(app.CustomGovKeeper),
   383  			customgov.NewApplyRemoveWhitelistedRolePermissionProposalHandler(app.CustomGovKeeper),
   384  			customgov.NewApplyRemoveBlacklistedRolePermissionProposalHandler(app.CustomGovKeeper),
   385  			customgov.NewApplySetProposalDurationsProposalHandler(app.CustomGovKeeper),
   386  			upgrade.NewApplySoftwareUpgradeProposalHandler(app.UpgradeKeeper),
   387  			upgrade.NewApplyCancelSoftwareUpgradeProposalHandler(app.UpgradeKeeper),
   388  			spending.NewApplyUpdateSpendingPoolProposalHandler(app.SpendingKeeper),
   389  			spending.NewApplySpendingPoolDistributionProposalHandler(app.SpendingKeeper, app.CustomGovKeeper),
   390  			spending.NewApplySpendingPoolWithdrawProposalHandler(app.SpendingKeeper, app.BankKeeper),
   391  			ubi.NewApplyUpsertUBIProposalHandler(app.UbiKeeper, app.CustomGovKeeper, app.SpendingKeeper),
   392  			ubi.NewApplyRemoveUBIProposalHandler(app.UbiKeeper),
   393  			basket.NewApplyCreateBasketProposalHandler(app.BasketKeeper),
   394  			basket.NewApplyEditBasketProposalHandler(app.BasketKeeper),
   395  			basket.NewApplyBasketWithdrawSurplusProposalHandler(app.BasketKeeper),
   396  			collectives.NewApplyCollectiveSendDonationProposalHandler(app.CollectivesKeeper),
   397  			collectives.NewApplyCollectiveUpdateProposalHandler(app.CollectivesKeeper),
   398  			collectives.NewApplyCollectiveRemoveProposalHandler(app.CollectivesKeeper),
   399  			layer2.NewApplyJoinDappProposalHandler(app.Layer2Keeper),
   400  			layer2.NewApplyUpsertDappProposalHandler(app.Layer2Keeper),
   401  		})
   402  
   403  	app.CustomGovKeeper.SetProposalRouter(proposalRouter)
   404  
   405  	/****  Module Options ****/
   406  
   407  	// NOTE: Any module instantiated in the module manager that is later modified
   408  	// must be passed by reference here.
   409  	app.mm = module.NewManager(
   410  		auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)),
   411  		genutil.NewAppModule(
   412  			app.AccountKeeper, app.CustomStakingKeeper, app.BaseApp.DeliverTx,
   413  			encodingConfig.TxConfig,
   414  		),
   415  		bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)),
   416  		upgrade.NewAppModule(app.UpgradeKeeper),
   417  		params.NewAppModule(app.ParamsKeeper),
   418  		customslashing.NewAppModule(appCodec, app.CustomSlashingKeeper, app.CustomStakingKeeper),
   419  		recovery.NewAppModule(appCodec, app.RecoveryKeeper, app.AccountKeeper, app.CustomStakingKeeper),
   420  		customstaking.NewAppModule(app.CustomStakingKeeper, app.CustomGovKeeper),
   421  		multistaking.NewAppModule(app.MultiStakingKeeper, app.BankKeeper, app.CustomGovKeeper, app.CustomStakingKeeper),
   422  		customgov.NewAppModule(app.CustomGovKeeper),
   423  		tokens.NewAppModule(app.TokensKeeper, app.CustomGovKeeper),
   424  		spending.NewAppModule(app.SpendingKeeper, app.CustomGovKeeper, app.BankKeeper),
   425  		distributor.NewAppModule(app.DistrKeeper, app.CustomGovKeeper),
   426  		basket.NewAppModule(app.BasketKeeper, app.CustomGovKeeper),
   427  		ubi.NewAppModule(app.UbiKeeper, app.CustomGovKeeper),
   428  		feeprocessing.NewAppModule(app.FeeProcessingKeeper),
   429  		evidence.NewAppModule(app.EvidenceKeeper),
   430  		custody.NewAppModule(app.CustodyKeeper, app.CustomGovKeeper, app.BankKeeper),
   431  		collectives.NewAppModule(app.CollectivesKeeper),
   432  		layer2.NewAppModule(app.Layer2Keeper),
   433  		consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper),
   434  	)
   435  
   436  	// During begin block slashing happens after distr.BeginBlocker so that
   437  	// there is nothing left over in the validator fee pool, so as to keep the
   438  	// CanWithdrawInvariant invariant.
   439  	app.mm.SetOrderBeginBlockers(
   440  		genutiltypes.ModuleName, paramstypes.ModuleName, govtypes.ModuleName, tokenstypes.ModuleName,
   441  		authtypes.ModuleName, feeprocessingtypes.ModuleName, banktypes.ModuleName,
   442  		upgradetypes.ModuleName, slashingtypes.ModuleName, recoverytypes.ModuleName,
   443  		evidencetypes.ModuleName, stakingtypes.ModuleName,
   444  		spendingtypes.ModuleName, ubitypes.ModuleName,
   445  		distributortypes.ModuleName, multistakingtypes.ModuleName, custodytypes.ModuleName,
   446  		baskettypes.ModuleName,
   447  		distributortypes.ModuleName, multistakingtypes.ModuleName, custodytypes.ModuleName,
   448  		baskettypes.ModuleName,
   449  		collectivestypes.ModuleName,
   450  		layer2types.ModuleName,
   451  		consensusparamtypes.ModuleName,
   452  	)
   453  	app.mm.SetOrderEndBlockers(
   454  		banktypes.ModuleName, upgradetypes.ModuleName, tokenstypes.ModuleName,
   455  		evidencetypes.ModuleName, genutiltypes.ModuleName, paramstypes.ModuleName,
   456  		slashingtypes.ModuleName, authtypes.ModuleName, recoverytypes.ModuleName,
   457  		govtypes.ModuleName,
   458  		stakingtypes.ModuleName,
   459  		feeprocessingtypes.ModuleName,
   460  		spendingtypes.ModuleName, ubitypes.ModuleName,
   461  		distributortypes.ModuleName, multistakingtypes.ModuleName, custodytypes.ModuleName,
   462  		baskettypes.ModuleName,
   463  		collectivestypes.ModuleName,
   464  		layer2types.ModuleName,
   465  		consensusparamtypes.ModuleName,
   466  	)
   467  
   468  	// NOTE: The genutils moodule must occur after staking so that pools are
   469  	// properly initialized with tokens from genesis accounts.
   470  	// NOTE: Capability module must occur first so that it can initialize any capabilities
   471  	// so that other modules that want to create or claim capabilities afterwards in InitChain
   472  	// can do so safely.
   473  	app.mm.SetOrderInitGenesis(
   474  		authtypes.ModuleName,
   475  		banktypes.ModuleName,
   476  		govtypes.ModuleName, // staking module is using the moniker identity registrar and gov module should be initialized before
   477  		stakingtypes.ModuleName,
   478  		slashingtypes.ModuleName,
   479  		recoverytypes.ModuleName,
   480  		tokenstypes.ModuleName,
   481  		feeprocessingtypes.ModuleName,
   482  		genutiltypes.ModuleName,
   483  		evidencetypes.ModuleName,
   484  		upgradetypes.ModuleName,
   485  		spendingtypes.ModuleName,
   486  		ubitypes.ModuleName,
   487  		paramstypes.ModuleName,
   488  		distributortypes.ModuleName,
   489  		custodytypes.ModuleName,
   490  		multistakingtypes.ModuleName,
   491  		baskettypes.ModuleName,
   492  		collectivestypes.ModuleName,
   493  		layer2types.ModuleName,
   494  		consensusparamtypes.ModuleName,
   495  	)
   496  
   497  	app.mm.RegisterServices(module.NewConfigurator(appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()))
   498  
   499  	// add test gRPC service for testing gRPC queries in isolation
   500  	testdata.RegisterQueryServer(app.GRPCQueryRouter(), testdata.QueryImpl{})
   501  
   502  	// create the simulation manager and define the order of the modules for deterministic simulations
   503  	//
   504  	// NOTE: this is not required apps that don't use the simulator for fuzz testing
   505  	// transactions
   506  	overrideModules := map[string]module.AppModuleSimulation{
   507  		authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)),
   508  	}
   509  	app.sm = module.NewSimulationManagerFromAppModules(app.mm.Modules, overrideModules)
   510  
   511  	app.sm.RegisterStoreDecoders()
   512  
   513  	// initialize stores
   514  	app.MountKVStores(keys)
   515  	app.MountTransientStores(tKeys)
   516  
   517  	// initialize BaseApp
   518  	app.SetInitChainer(app.InitChainer)
   519  	app.SetBeginBlocker(app.BeginBlocker)
   520  	app.SetAnteHandler(
   521  		customante.NewAnteHandler(
   522  			app.CustomStakingKeeper,
   523  			app.CustomGovKeeper,
   524  			app.TokensKeeper,
   525  			app.FeeProcessingKeeper,
   526  			app.AccountKeeper,
   527  			app.BankKeeper,
   528  			app.CustodyKeeper,
   529  			nil,
   530  			nil,
   531  			ante.DefaultSigVerificationGasConsumer,
   532  			encodingConfig.TxConfig.SignModeHandler(),
   533  			nil,
   534  		),
   535  	)
   536  	app.SetEndBlocker(app.EndBlocker)
   537  
   538  	if loadLatest {
   539  		if err := app.LoadLatestVersion(); err != nil {
   540  			tmos.Exit(err.Error())
   541  		}
   542  	}
   543  
   544  	return app
   545  }
   546  
   547  func (app *SekaiApp) setPostHandler() {
   548  	postHandler, err := posthandler.NewPostHandler(
   549  		posthandler.HandlerOptions{},
   550  	)
   551  	if err != nil {
   552  		panic(err)
   553  	}
   554  
   555  	app.SetPostHandler(postHandler)
   556  }
   557  
   558  // Name returns the name of the App
   559  func (app *SekaiApp) Name() string { return app.BaseApp.Name() }
   560  
   561  // BeginBlocker application updates every begin block
   562  func (app *SekaiApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock {
   563  	return app.mm.BeginBlock(ctx, req)
   564  }
   565  
   566  // EndBlocker application updates every end block
   567  func (app *SekaiApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock {
   568  	return app.mm.EndBlock(ctx, req)
   569  }
   570  
   571  // InitChainer application update at chain initialization
   572  func (app *SekaiApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
   573  	var genesisState GenesisState
   574  	app.cdc.MustUnmarshalJSON(req.AppStateBytes, &genesisState)
   575  	return app.mm.InitGenesis(ctx, app.appCodec, genesisState)
   576  }
   577  
   578  // LoadHeight loads a particular height
   579  func (app *SekaiApp) LoadHeight(height int64) error {
   580  	return app.LoadVersion(height)
   581  }
   582  
   583  // ModuleAccountAddrs returns all the app's module account addresses.
   584  func (app *SekaiApp) ModuleAccountAddrs() map[string]bool {
   585  	modAccAddrs := make(map[string]bool)
   586  	for acc := range maccPerms {
   587  		modAccAddrs[authtypes.NewModuleAddress(acc).String()] = true
   588  	}
   589  
   590  	return modAccAddrs
   591  }
   592  
   593  // BlockedAddresses returns all the app's blocked account addresses.
   594  func BlockedAddresses() map[string]bool {
   595  	modAccAddrs := make(map[string]bool)
   596  	for acc := range GetMaccPerms() {
   597  		modAccAddrs[authtypes.NewModuleAddress(acc).String()] = true
   598  	}
   599  
   600  	// allow the following addresses to receive funds
   601  	delete(modAccAddrs, authtypes.NewModuleAddress(govtypes.ModuleName).String())
   602  
   603  	return modAccAddrs
   604  }
   605  
   606  // Codec returns SimApp's codec.
   607  //
   608  // NOTE: This is solely to be used for testing purposes as it may be desirable
   609  // for modules to register their own custom testing types.
   610  func (app *SekaiApp) LegacyAmino() *codec.LegacyAmino {
   611  	return app.cdc
   612  }
   613  
   614  // AppCodec returns SimApp's app codec.
   615  //
   616  // NOTE: This is solely to be used for testing purposes as it may be desirable
   617  // for modules to register their own custom testing types.
   618  func (app *SekaiApp) AppCodec() codec.Codec {
   619  	return app.appCodec
   620  }
   621  
   622  // InterfaceRegistry returns SimApp's InterfaceRegistry
   623  func (app *SekaiApp) InterfaceRegistry() types.InterfaceRegistry {
   624  	return app.interfaceRegistry
   625  }
   626  
   627  // GetKey returns the KVStoreKey for the provided store key.
   628  //
   629  // NOTE: This is solely to be used for testing purposes.
   630  func (app *SekaiApp) GetKey(storeKey string) *storetypes.KVStoreKey {
   631  	return app.keys[storeKey]
   632  }
   633  
   634  // GetTKey returns the TransientStoreKey for the provided store key.
   635  //
   636  // NOTE: This is solely to be used for testing purposes.
   637  func (app *SekaiApp) GetTKey(storeKey string) *storetypes.TransientStoreKey {
   638  	return app.tKeys[storeKey]
   639  }
   640  
   641  // GetMemKey returns the MemStoreKey for the provided mem key.
   642  //
   643  // NOTE: This is solely used for testing purposes.
   644  func (app *SekaiApp) GetMemKey(storeKey string) *storetypes.MemoryStoreKey {
   645  	return app.memKeys[storeKey]
   646  }
   647  
   648  // GetSubspace returns a param subspace for a given module name.
   649  //
   650  // NOTE: This is solely to be used for testing purposes.
   651  func (app *SekaiApp) GetSubspace(moduleName string) paramstypes.Subspace {
   652  	subspace, _ := app.ParamsKeeper.GetSubspace(moduleName)
   653  	return subspace
   654  }
   655  
   656  // SimulationManager implements the SimulationApp interface
   657  func (app *SekaiApp) SimulationManager() *module.SimulationManager {
   658  	return app.sm
   659  }
   660  
   661  // RegisterAPIRoutes registers all application module routes with the provided
   662  // API server.
   663  func (app *SekaiApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) {
   664  	clientCtx := apiSvr.ClientCtx
   665  	// Register new tx routes from grpc-gateway.
   666  	authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
   667  
   668  	// Register new tendermint queries routes from grpc-gateway.
   669  	tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
   670  
   671  	// Register node gRPC service for grpc-gateway.
   672  	nodeservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
   673  
   674  	// Register grpc-gateway routes for all modules.
   675  	ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
   676  
   677  	// register swagger API from root so that other applications can override easily
   678  	if err := server.RegisterSwaggerAPI(apiSvr.ClientCtx, apiSvr.Router, apiConfig.Swagger); err != nil {
   679  		panic(err)
   680  	}
   681  }
   682  
   683  // RegisterTxService implements the Application.RegisterTxService method.
   684  func (app *SekaiApp) RegisterTxService(clientCtx client.Context) {
   685  	authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry)
   686  }
   687  
   688  // RegisterTendermintService implements the Application.RegisterTendermintService method.
   689  func (app *SekaiApp) RegisterTendermintService(clientCtx client.Context) {
   690  	tmservice.RegisterTendermintService(
   691  		clientCtx,
   692  		app.BaseApp.GRPCQueryRouter(),
   693  		app.interfaceRegistry,
   694  		app.Query,
   695  	)
   696  }
   697  
   698  func (app *SekaiApp) RegisterNodeService(clientCtx client.Context) {
   699  	nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter())
   700  }
   701  
   702  // RegisterSwaggerAPI registers swagger route with API Server
   703  func RegisterSwaggerAPI(ctx client.Context, rtr *mux.Router) {
   704  	statikFS, err := fs.New()
   705  	if err != nil {
   706  		panic(err)
   707  	}
   708  
   709  	staticServer := http.FileServer(statikFS)
   710  	rtr.PathPrefix("/swagger/").Handler(http.StripPrefix("/swagger/", staticServer))
   711  }
   712  
   713  // GetMaccPerms returns a copy of the module account permissions
   714  func GetMaccPerms() map[string][]string {
   715  	dupMaccPerms := make(map[string][]string)
   716  	for k, v := range maccPerms {
   717  		dupMaccPerms[k] = v
   718  	}
   719  	return dupMaccPerms
   720  }
   721  
   722  // initParamsKeeper init params keeper and its subspaces
   723  func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper {
   724  	paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey)
   725  
   726  	paramsKeeper.Subspace(authtypes.ModuleName)
   727  	paramsKeeper.Subspace(banktypes.ModuleName)
   728  	paramsKeeper.Subspace(stakingtypes.ModuleName)
   729  	paramsKeeper.Subspace(slashingtypes.ModuleName)
   730  	paramsKeeper.Subspace(multistakingtypes.ModuleName)
   731  	paramsKeeper.Subspace(baskettypes.ModuleName)
   732  
   733  	return paramsKeeper
   734  }