Synopsis

Learn how to implement the IBC Module keeper. 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.
Note that some code has been left out for clarity, to get a full code overview, please refer to the transfer module’s keeper in the ibc-go repo.
/ Keeper defines the IBC app module keeper
type 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 instance
func 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 port
func (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 function
func (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 ExportGenesis
func (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 InitGenesis
func (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 function
func (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 it
func (k Keeper)

ClaimCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string)

error {
    return k.scopedKeeper.ClaimCapability(ctx, cap, name)
}

/ ... additional according to custom logic