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 }