mukan-core/app/ibc.go
2026-05-11 03:46:11 +03:00

171 lines
7.3 KiB
Go

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
}