In the previous sections, on channel handshake callbacks and port binding in InitGenesis, a reference was made to keeper methods that need to be implemented when creating a custom IBC module. Below is an overview of how to define an IBC module’s keeper.
/ Keeper defines the IBC app module keepertype Keeper struct { storeKey sdk.StoreKey cdc codec.BinaryCodec paramSpace paramtypes.Subspace channelKeeper types.ChannelKeeper portKeeper types.PortKeeper scopedKeeper capabilitykeeper.ScopedKeeper / ... additional according to custom logic}/ NewKeeper creates a new IBC app module Keeper instancefunc NewKeeper( / args)Keeper { / ... return Keeper{ cdc: cdc, storeKey: key, paramSpace: paramSpace, channelKeeper: channelKeeper, portKeeper: portKeeper, scopedKeeper: scopedKeeper, / ... additional according to custom logic}}/ hasCapability checks if the IBC app module owns the port capability for the desired portfunc (k Keeper)hasCapability(ctx sdk.Context, portID string)bool { _, ok := k.scopedKeeper.GetCapability(ctx, host.PortPath(portID))return ok}/ BindPort defines a wrapper function for the port Keeper's function in/ order to expose it to module's InitGenesis functionfunc (k Keeper)BindPort(ctx sdk.Context, portID string)error { cap := k.portKeeper.BindPort(ctx, portID)return k.ClaimCapability(ctx, cap, host.PortPath(portID))}/ GetPort returns the portID for the IBC app module. Used in ExportGenesisfunc (k Keeper)GetPort(ctx sdk.Context)string { store := ctx.KVStore(k.storeKey)return string(store.Get(types.PortKey))}/ SetPort sets the portID for the IBC app module. Used in InitGenesisfunc (k Keeper)SetPort(ctx sdk.Context, portID string) { store := ctx.KVStore(k.storeKey)store.Set(types.PortKey, []byte(portID))}/ AuthenticateCapability wraps the scopedKeeper's AuthenticateCapability functionfunc (k Keeper)AuthenticateCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string)bool { return k.scopedKeeper.AuthenticateCapability(ctx, cap, name)}/ ClaimCapability allows the IBC app module to claim a capability that core IBC/ passes to itfunc (k Keeper)ClaimCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string)error { return k.scopedKeeper.ClaimCapability(ctx, cap, name)}/ ... additional according to custom logic