Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: continue to simplify keeper initialization in app.go #2024

Merged
merged 4 commits into from
Nov 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
155 changes: 72 additions & 83 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"github.com/cosmos/cosmos-sdk/server/api"
"github.com/cosmos/cosmos-sdk/server/config"
servertypes "github.com/cosmos/cosmos-sdk/server/types"
store "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
"github.com/cosmos/cosmos-sdk/version"
Expand Down Expand Up @@ -200,6 +201,7 @@ func NewAxelarApp(

keys := createStoreKeys()
tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey)
memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)

keepers := newKeeperCache()
setKeeper(keepers, initParamsKeeper(encodingConfig, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]))
Expand All @@ -210,49 +212,32 @@ func NewAxelarApp(
moduleAccountPermissions := initModuleAccountPermissions()
appCodec := encodingConfig.Codec

// add keepers
// set up predefined keepers
setKeeper(keepers, initAccountKeeper(appCodec, keys, keepers, moduleAccountPermissions))
setKeeper(keepers, initBankKeeper(appCodec, keys, keepers, moduleAccountPermissions))

stakingK := stakingkeeper.NewKeeper(
appCodec, keys[stakingtypes.StoreKey], getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[bankkeeper.BaseKeeper](keepers), keepers.getSubspace(stakingtypes.ModuleName),
)

setKeeper(keepers, initMintKeeper(appCodec, keys, keepers, &stakingK))
setKeeper(keepers, initDistributionKeeper(appCodec, keys, keepers, &stakingK, moduleAccountPermissions))
setKeeper(keepers, initSlashingKeeper(appCodec, keys, keepers, &stakingK))
setKeeper(keepers, initStakingKeeper(appCodec, keys, keepers))
setKeeper(keepers, initMintKeeper(appCodec, keys, keepers))
setKeeper(keepers, initDistributionKeeper(appCodec, keys, keepers, moduleAccountPermissions))
setKeeper(keepers, initSlashingKeeper(appCodec, keys, keepers))
setKeeper(keepers, initCrisisKeeper(keepers, invCheckPeriod))

// todo: change order of commands so this doesn't have to be defined before initialization
var configurator module.Configurator
var mm *module.Manager
setKeeper(keepers, initUpgradeKeeper(appCodec, keys, skipUpgradeHeights, homePath, bApp, &configurator, mm))
setKeeper(keepers, initEvidenceKeeper(appCodec, keys, keepers, &stakingK))
setKeeper(keepers, initUpgradeKeeper(appCodec, keys, skipUpgradeHeights, homePath, bApp))
setKeeper(keepers, initEvidenceKeeper(appCodec, keys, keepers))
setKeeper(keepers, initFeegrantKeeper(appCodec, keys, keepers))

// register the staking hooks
// NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks
stakingK = *stakingK.SetHooks(
stakingtypes.NewMultiStakingHooks(getKeeper[distrkeeper.Keeper](keepers).Hooks(), getKeeper[slashingkeeper.Keeper](keepers).Hooks()),
)
setKeeper(keepers, &stakingK)

// add capability keeper and ScopeToModule for ibc module
memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
// TODO: remove variable
capabilityK := capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey])

// grant capabilities for the ibc, ibc-transfer and wasm modules
scopedIBCK := capabilityK.ScopeToModule(ibchost.ModuleName)
scopedTransferK := capabilityK.ScopeToModule(ibctransfertypes.ModuleName)
scopedWasmK := capabilityK.ScopeToModule(wasm.ModuleName)

capabilityK.Seal()
setKeeper(keepers, capabilityK)
setKeeper(keepers, initIBCKeeper(appCodec, keys, keepers, scopedIBCK))
// Custom axelarnet/evm/nexus keepers
setKeeper(keepers, initIBCKeeper(appCodec, keys, keepers))

// set up custom axelar keepers
setKeeper(keepers, initAxelarnetKeeper(appCodec, keys, keepers))
setKeeper(keepers, initEvmKeeper(appCodec, keys, keepers))
setKeeper(keepers, initNexusKeeper(appCodec, keys, keepers))
setKeeper(keepers, initRewardKeeper(appCodec, keys, keepers))
setKeeper(keepers, initMultisigKeeper(appCodec, keys, keepers))
setKeeper(keepers, initTssKeeper(appCodec, keys, keepers))
setKeeper(keepers, initSnapshotKeeper(appCodec, keys, keepers))
setKeeper(keepers, initVoteKeeper(appCodec, keys, keepers))
setKeeper(keepers, initPermissionKeeper(appCodec, keys, keepers))

// IBC Transfer Stack: SendPacket
//
Expand Down Expand Up @@ -284,7 +269,8 @@ func NewAxelarApp(
}

// Create Transfer Keepers
setKeeper(keepers, initIBCTransferKeeper(appCodec, keys, keepers, ics4Wrapper, scopedTransferK))
setKeeper(keepers, initIBCTransferKeeper(appCodec, keys, keepers, ics4Wrapper))
setKeeper(keepers, initAxelarIBCKeeper(keepers))

// IBC Transfer Stack: RecvPacket
//
Expand All @@ -297,66 +283,37 @@ func NewAxelarApp(

setKeeper(keepers, initAxelarIBCKeeper(keepers))

messageRouter := nexusTypes.NewMessageRouter().
AddRoute(evmTypes.ModuleName, evmKeeper.NewMessageRoute()).
AddRoute(axelarnetTypes.ModuleName, axelarnetKeeper.NewMessageRoute(getKeeper[axelarnetKeeper.Keeper](keepers), getKeeper[axelarnetKeeper.IBCKeeper](keepers), getKeeper[feegrantkeeper.Keeper](keepers), axelarbankkeeper.NewBankKeeper(getKeeper[bankkeeper.BaseKeeper](keepers)), getKeeper[nexusKeeper.Keeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers)))

axelarnetModule := axelarnet.NewAppModule(getKeeper[axelarnetKeeper.Keeper](keepers), getKeeper[nexusKeeper.Keeper](keepers), axelarbankkeeper.NewBankKeeper(getKeeper[bankkeeper.BaseKeeper](keepers)), getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[axelarnetKeeper.IBCKeeper](keepers), transferStack, rateLimiter, logger)

// Create static IBC router, add axelarnet module as the IBC transfer route, and seal it
ibcRouter := porttypes.NewRouter()
ibcRouter.AddRoute(ibctransfertypes.ModuleName, axelarnetModule)
wasmDir := filepath.Join(homePath, "wasm")
wasmConfig := mustReadWasmConfig(appOpts)

// axelar custom keepers
// axelarnet / evm / nexus keepers created above
setKeeper(keepers, initRewardKeeper(appCodec, keys, keepers))
setKeeper(keepers, initMultisigKeeper(appCodec, keys, keepers))
setKeeper(keepers, initTssKeeper(appCodec, keys, keepers))
setKeeper(keepers, initSnapshotKeeper(appCodec, keys, keepers))
setKeeper(keepers, initVoteKeeper(appCodec, keys, keepers))
setKeeper(keepers, initPermissionKeeper(appCodec, keys, keepers))
scopedWasmK := capabilityK.ScopeToModule(wasm.ModuleName)
wasmK := initWasmKeeper(appCodec, keys, keepers, scopedWasmK, bApp, wasmDir, wasmConfig, wasmOpts)
setKeeper(keepers, wasmK)

var wasmK wasm.Keeper
setKeeper(keepers, initGovernanceKeeper(appCodec, keys, keepers))

wasmDir := filepath.Join(homePath, "wasm")
wasmConfig := mustReadWasmConfig(appOpts)
capabilityK.Seal()

if IsWasmEnabled() {
// set the contract keeper for the Ics20WasmHooks
wasmHooks.ContractKeeper = wasmkeeper.NewDefaultPermissionKeeper(wasmK)

// The last arguments can contain custom message handlers, and custom query handlers,
// if we want to allow any custom callbacks
wasmOpts = append(wasmOpts, wasmkeeper.WithMessageHandlerDecorator(func(old wasmkeeper.Messenger) wasmkeeper.Messenger {
return wasmkeeper.NewMessageHandlerChain(old, nexusKeeper.NewMessenger(getKeeper[nexusKeeper.Keeper](keepers)))
}))
wasmK = wasm.NewKeeper(
appCodec,
keys[wasm.StoreKey],
keepers.getSubspace(wasm.ModuleName),
getKeeper[authkeeper.AccountKeeper](keepers),
getKeeper[bankkeeper.BaseKeeper](keepers),
getKeeper[stakingkeeper.Keeper](keepers),
getKeeper[distrkeeper.Keeper](keepers),
getKeeper[*ibckeeper.Keeper](keepers).ChannelKeeper,
getKeeper[*ibckeeper.Keeper](keepers).ChannelKeeper,
&getKeeper[*ibckeeper.Keeper](keepers).PortKeeper,
scopedWasmK,
getKeeper[ibctransferkeeper.Keeper](keepers),
bApp.MsgServiceRouter(),
bApp.GRPCQueryRouter(),
wasmDir,
wasmConfig,
WasmCapabilities,
wasmOpts...,
)
messageRouter := nexusTypes.NewMessageRouter().
AddRoute(evmTypes.ModuleName, evmKeeper.NewMessageRoute()).
AddRoute(axelarnetTypes.ModuleName, axelarnetKeeper.NewMessageRoute(getKeeper[axelarnetKeeper.Keeper](keepers), getKeeper[axelarnetKeeper.IBCKeeper](keepers), getKeeper[feegrantkeeper.Keeper](keepers), axelarbankkeeper.NewBankKeeper(getKeeper[bankkeeper.BaseKeeper](keepers)), getKeeper[nexusKeeper.Keeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers)))
cgorenflo marked this conversation as resolved.
Show resolved Hide resolved

// Create static IBC router, add axelarnet module as the IBC transfer route, and seal it
ibcRouter := porttypes.NewRouter()
ibcRouter.AddRoute(ibctransfertypes.ModuleName, axelarnetModule)
if IsWasmEnabled() {
// Create wasm ibc stack
var wasmStack porttypes.IBCModule = wasm.NewIBCHandler(wasmK, getKeeperAsRef[ibckeeper.Keeper](keepers).ChannelKeeper, getKeeperAsRef[ibckeeper.Keeper](keepers).ChannelKeeper)
ibcRouter.AddRoute(wasm.ModuleName, wasmStack)

// set the contract keeper for the Ics20WasmHooks
contractKeeper := wasmkeeper.NewDefaultPermissionKeeper(wasmK)
wasmHooks.ContractKeeper = contractKeeper
setKeeper(keepers, wasmK)

messageRouter.AddRoute(wasm.ModuleName, nexusKeeper.NewMessageRoute(getKeeperAsRef[nexusKeeper.Keeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers), contractKeeper))
}
Expand All @@ -366,13 +323,17 @@ func NewAxelarApp(
// Finalize the IBC router
getKeeperAsRef[ibckeeper.Keeper](keepers).SetRouter(ibcRouter)

setKeeper(keepers, initGovernanceKeeper(appCodec, keys, keepers))
// register the staking hooks
// NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks
getKeeperAsRef[stakingkeeper.Keeper](keepers).SetHooks(
stakingtypes.NewMultiStakingHooks(getKeeper[distrkeeper.Keeper](keepers).Hooks(), getKeeper[slashingkeeper.Keeper](keepers).Hooks()),
)

/**** Module Options ****/

appModules := initAppModules(keepers, bApp, encodingConfig, appOpts, axelarnetModule)

mm = module.NewManager(appModules...)
mm := module.NewManager(appModules...)
mm.SetOrderMigrations(orderMigrations()...)
mm.SetOrderBeginBlockers(orderBeginBlockers()...)
mm.SetOrderEndBlockers(orderEndBlockers()...)
Expand All @@ -383,7 +344,7 @@ func NewAxelarApp(

// register all module routes and module queriers
mm.RegisterRoutes(bApp.Router(), bApp.QueryRouter(), encodingConfig.Amino)
configurator = module.NewConfigurator(appCodec, bApp.MsgServiceRouter(), bApp.GRPCQueryRouter())
configurator := module.NewConfigurator(appCodec, bApp.MsgServiceRouter(), bApp.GRPCQueryRouter())
mm.RegisterServices(configurator)

var app = &AxelarApp{
Expand All @@ -399,6 +360,8 @@ func NewAxelarApp(
upgradeKeeper: getKeeper[upgradekeeper.Keeper](keepers),
}

app.setUpgradeBehaviour(configurator)

// initialize stores
app.MountKVStores(keys)
app.MountTransientStores(tkeys)
Expand Down Expand Up @@ -435,6 +398,32 @@ func NewAxelarApp(
return app
}

func (app *AxelarApp) setUpgradeBehaviour(configurator module.Configurator) {
app.upgradeKeeper.SetUpgradeHandler(
upgradeName(app.Version()),
func(ctx sdk.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
return app.mm.RunMigrations(ctx, configurator, fromVM)
},
)

upgradeInfo, err := app.upgradeKeeper.ReadUpgradeInfoFromDisk()
if err != nil {
panic(err)
}

if upgradeInfo.Name == upgradeName(app.Version()) && !app.upgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
storeUpgrades := store.StoreUpgrades{}

if IsWasmEnabled() {
storeUpgrades.Added = append(storeUpgrades.Added, ibchookstypes.StoreKey)
storeUpgrades.Added = append(storeUpgrades.Added, wasm.ModuleName)
}

// configure store loader that checks if version == upgradeHeight and applies store upgrades
app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
}
}

func initBaseApp(db dbm.DB, traceStore io.Writer, encodingConfig axelarParams.EncodingConfig, keepers *keeperCache, baseAppOptions []func(*bam.BaseApp), logger log.Logger) *bam.BaseApp {
bApp := bam.NewBaseApp(Name, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...)
bApp.SetCommitMultiStoreTracer(traceStore)
Expand Down
Loading
Loading