171 lines
7.2 KiB
Go
171 lines
7.2 KiB
Go
package app
|
|
|
|
import (
|
|
"cosmossdk.io/core/appmodule"
|
|
storetypes "cosmossdk.io/store/types"
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
"github.com/cosmos/cosmos-sdk/runtime"
|
|
servertypes "github.com/cosmos/cosmos-sdk/server/types"
|
|
"github.com/cosmos/cosmos-sdk/types/module"
|
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
|
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
|
|
icamodule "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts"
|
|
icacontroller "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller"
|
|
icacontrollerkeeper "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/keeper"
|
|
icacontrollertypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/types"
|
|
icahost "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host"
|
|
icahostkeeper "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/keeper"
|
|
icahosttypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/types"
|
|
icatypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/types"
|
|
ibctransfer "github.com/cosmos/ibc-go/v10/modules/apps/transfer"
|
|
ibctransferkeeper "github.com/cosmos/ibc-go/v10/modules/apps/transfer/keeper"
|
|
ibctransfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types"
|
|
ibctransferv2 "github.com/cosmos/ibc-go/v10/modules/apps/transfer/v2"
|
|
ibc "github.com/cosmos/ibc-go/v10/modules/core"
|
|
ibcclienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types" // nolint:staticcheck // Deprecated: params key table is needed for params migration
|
|
ibcconnectiontypes "github.com/cosmos/ibc-go/v10/modules/core/03-connection/types"
|
|
porttypes "github.com/cosmos/ibc-go/v10/modules/core/05-port/types"
|
|
ibcapi "github.com/cosmos/ibc-go/v10/modules/core/api"
|
|
ibcexported "github.com/cosmos/ibc-go/v10/modules/core/exported"
|
|
ibckeeper "github.com/cosmos/ibc-go/v10/modules/core/keeper"
|
|
solomachine "github.com/cosmos/ibc-go/v10/modules/light-clients/06-solomachine"
|
|
ibctm "github.com/cosmos/ibc-go/v10/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
|
|
}
|