package app import ( "cosmossdk.io/core/appmodule" storetypes "cosmossdk.io/store/types" "git.cw.tr/mukan-network/mukan-sdk/codec" "git.cw.tr/mukan-network/mukan-sdk/runtime" servertypes "git.cw.tr/mukan-network/mukan-sdk/server/types" "git.cw.tr/mukan-network/mukan-sdk/types/module" authtypes "git.cw.tr/mukan-network/mukan-sdk/x/auth/types" govtypes "git.cw.tr/mukan-network/mukan-sdk/x/gov/types" icamodule "git.cw.tr/mukan-network/mukan-ibc/modules/apps/27-interchain-accounts" icacontroller "git.cw.tr/mukan-network/mukan-ibc/modules/apps/27-interchain-accounts/controller" icacontrollerkeeper "git.cw.tr/mukan-network/mukan-ibc/modules/apps/27-interchain-accounts/controller/keeper" icacontrollertypes "git.cw.tr/mukan-network/mukan-ibc/modules/apps/27-interchain-accounts/controller/types" icahost "git.cw.tr/mukan-network/mukan-ibc/modules/apps/27-interchain-accounts/host" icahostkeeper "git.cw.tr/mukan-network/mukan-ibc/modules/apps/27-interchain-accounts/host/keeper" icahosttypes "git.cw.tr/mukan-network/mukan-ibc/modules/apps/27-interchain-accounts/host/types" icatypes "git.cw.tr/mukan-network/mukan-ibc/modules/apps/27-interchain-accounts/types" ibctransfer "git.cw.tr/mukan-network/mukan-ibc/modules/apps/transfer" ibctransferkeeper "git.cw.tr/mukan-network/mukan-ibc/modules/apps/transfer/keeper" ibctransfertypes "git.cw.tr/mukan-network/mukan-ibc/modules/apps/transfer/types" ibctransferv2 "git.cw.tr/mukan-network/mukan-ibc/modules/apps/transfer/v2" ibc "git.cw.tr/mukan-network/mukan-ibc/modules/core" ibcclienttypes "git.cw.tr/mukan-network/mukan-ibc/modules/core/02-client/types" // nolint:staticcheck // Deprecated: params key table is needed for params migration ibcconnectiontypes "git.cw.tr/mukan-network/mukan-ibc/modules/core/03-connection/types" porttypes "git.cw.tr/mukan-network/mukan-ibc/modules/core/05-port/types" ibcapi "git.cw.tr/mukan-network/mukan-ibc/modules/core/api" ibcexported "git.cw.tr/mukan-network/mukan-ibc/modules/core/exported" ibckeeper "git.cw.tr/mukan-network/mukan-ibc/modules/core/keeper" solomachine "git.cw.tr/mukan-network/mukan-ibc/modules/light-clients/06-solomachine" ibctm "git.cw.tr/mukan-network/mukan-ibc/modules/light-clients/07-tendermint" ) // registerIBCModules register IBC keepers and non dependency inject modules. func (app *App) registerIBCModules(appOpts servertypes.AppOptions) error { // set up non depinject support modules store keys if err := app.RegisterStores( storetypes.NewKVStoreKey(ibcexported.StoreKey), storetypes.NewKVStoreKey(ibctransfertypes.StoreKey), storetypes.NewKVStoreKey(icahosttypes.StoreKey), storetypes.NewKVStoreKey(icacontrollertypes.StoreKey), ); err != nil { return err } // register the key tables for legacy param subspaces keyTable := ibcclienttypes.ParamKeyTable() keyTable.RegisterParamSet(&ibcconnectiontypes.Params{}) app.ParamsKeeper.Subspace(ibcexported.ModuleName).WithKeyTable(keyTable) app.ParamsKeeper.Subspace(ibctransfertypes.ModuleName).WithKeyTable(ibctransfertypes.ParamKeyTable()) app.ParamsKeeper.Subspace(icacontrollertypes.SubModuleName).WithKeyTable(icacontrollertypes.ParamKeyTable()) app.ParamsKeeper.Subspace(icahosttypes.SubModuleName).WithKeyTable(icahosttypes.ParamKeyTable()) govModuleAddr, _ := app.AuthKeeper.AddressCodec().BytesToString(authtypes.NewModuleAddress(govtypes.ModuleName)) // Create IBC keeper app.IBCKeeper = ibckeeper.NewKeeper( app.appCodec, runtime.NewKVStoreService(app.GetKey(ibcexported.StoreKey)), app.GetSubspace(ibcexported.ModuleName), app.UpgradeKeeper, govModuleAddr, ) // Create IBC transfer keeper app.TransferKeeper = ibctransferkeeper.NewKeeper( app.appCodec, runtime.NewKVStoreService(app.GetKey(ibctransfertypes.StoreKey)), app.GetSubspace(ibctransfertypes.ModuleName), app.IBCKeeper.ChannelKeeper, app.IBCKeeper.ChannelKeeper, app.MsgServiceRouter(), app.AuthKeeper, app.BankKeeper, govModuleAddr, ) // Create interchain account keepers app.ICAHostKeeper = icahostkeeper.NewKeeper( app.appCodec, runtime.NewKVStoreService(app.GetKey(icahosttypes.StoreKey)), app.GetSubspace(icahosttypes.SubModuleName), app.IBCKeeper.ChannelKeeper, // ICS4Wrapper app.IBCKeeper.ChannelKeeper, app.AuthKeeper, app.MsgServiceRouter(), app.GRPCQueryRouter(), govModuleAddr, ) app.ICAControllerKeeper = icacontrollerkeeper.NewKeeper( app.appCodec, runtime.NewKVStoreService(app.GetKey(icacontrollertypes.StoreKey)), app.GetSubspace(icacontrollertypes.SubModuleName), app.IBCKeeper.ChannelKeeper, app.IBCKeeper.ChannelKeeper, app.MsgServiceRouter(), govModuleAddr, ) // create IBC module from bottom to top of stack var ( transferStack porttypes.IBCModule = ibctransfer.NewIBCModule(app.TransferKeeper) transferStackV2 ibcapi.IBCModule = ibctransferv2.NewIBCModule(app.TransferKeeper) icaControllerStack porttypes.IBCModule = icacontroller.NewIBCMiddleware(app.ICAControllerKeeper) icaHostStack porttypes.IBCModule = icahost.NewIBCModule(app.ICAHostKeeper) ) // create IBC v1 router, add transfer route, then set it on the keeper ibcRouter := porttypes.NewRouter(). AddRoute(ibctransfertypes.ModuleName, transferStack). AddRoute(icacontrollertypes.SubModuleName, icaControllerStack). AddRoute(icahosttypes.SubModuleName, icaHostStack) // create IBC v2 router, add transfer route, then set it on the keeper ibcv2Router := ibcapi.NewRouter(). AddRoute(ibctransfertypes.PortID, transferStackV2) app.IBCKeeper.SetRouter(ibcRouter) app.IBCKeeper.SetRouterV2(ibcv2Router) clientKeeper := app.IBCKeeper.ClientKeeper storeProvider := clientKeeper.GetStoreProvider() tmLightClientModule := ibctm.NewLightClientModule(app.appCodec, storeProvider) clientKeeper.AddRoute(ibctm.ModuleName, &tmLightClientModule) soloLightClientModule := solomachine.NewLightClientModule(app.appCodec, storeProvider) clientKeeper.AddRoute(solomachine.ModuleName, &soloLightClientModule) // register IBC modules if err := app.RegisterModules( ibc.NewAppModule(app.IBCKeeper), ibctransfer.NewAppModule(app.TransferKeeper), icamodule.NewAppModule(&app.ICAControllerKeeper, &app.ICAHostKeeper), ibctm.NewAppModule(tmLightClientModule), solomachine.NewAppModule(soloLightClientModule), ); err != nil { return err } return nil } // RegisterIBC Since the IBC modules don't support dependency injection, // we need to manually register the modules on the client side. // This needs to be removed after IBC supports App Wiring. func RegisterIBC(cdc codec.Codec) map[string]appmodule.AppModule { modules := map[string]appmodule.AppModule{ ibcexported.ModuleName: ibc.NewAppModule(&ibckeeper.Keeper{}), ibctransfertypes.ModuleName: ibctransfer.NewAppModule(ibctransferkeeper.Keeper{}), icatypes.ModuleName: icamodule.NewAppModule(&icacontrollerkeeper.Keeper{}, &icahostkeeper.Keeper{}), ibctm.ModuleName: ibctm.NewAppModule(ibctm.NewLightClientModule(cdc, ibcclienttypes.StoreProvider{})), solomachine.ModuleName: solomachine.NewAppModule(solomachine.NewLightClientModule(cdc, ibcclienttypes.StoreProvider{})), } for _, m := range modules { if mr, ok := m.(module.AppModuleBasic); ok { mr.RegisterInterfaces(cdc.InterfaceRegistry()) } } return modules } // GetIBCKeeper returns the IBC keeper. // Used for supply with IBC keeper getter for the IBC modules with App Wiring. func (app *App) GetIBCKeeper() *ibckeeper.Keeper { return app.IBCKeeper }