Skip to main content
Version: Next

Keeper

Synopsis

Learn how to implement the IBC Module keeper. Relevant for IBC classic and v2

note

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

// ... 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,

// ... additional according to custom logic
}
}

// 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))
}

// ... additional according to custom logic