package ibc_composability_mw import ( "github.com/wormhole-foundation/wormchain/x/ibc-composability-mw/keeper" sdk "github.com/cosmos/cosmos-sdk/types" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" ) var _ porttypes.Middleware = &IBCMiddleware{} // IBCMiddleware implements the ICS26 callbacks for the wormhole middleware given the // forward keeper and the underlying application. type IBCMiddleware struct { app porttypes.IBCModule ics4 *ICS4Middleware keeper *keeper.Keeper } // NewIBCMiddleware creates a new IBCMiddleware given the keeper and underlying application. func NewIBCMiddleware( app porttypes.IBCModule, ics4 *ICS4Middleware, keeper *keeper.Keeper, ) IBCMiddleware { return IBCMiddleware{ app: app, ics4: ics4, keeper: keeper, } } // OnChanOpenInit implements the IBCModule interface. func (im IBCMiddleware) OnChanOpenInit( ctx sdk.Context, order channeltypes.Order, connectionHops []string, portID string, channelID string, chanCap *capabilitytypes.Capability, counterparty channeltypes.Counterparty, version string, ) (string, error) { return im.app.OnChanOpenInit(ctx, order, connectionHops, portID, channelID, chanCap, counterparty, version) } // OnChanOpenTry implements the IBCModule interface. func (im IBCMiddleware) OnChanOpenTry( ctx sdk.Context, order channeltypes.Order, connectionHops []string, portID, channelID string, chanCap *capabilitytypes.Capability, counterparty channeltypes.Counterparty, counterpartyVersion string, ) (version string, err error) { return im.app.OnChanOpenTry(ctx, order, connectionHops, portID, channelID, chanCap, counterparty, counterpartyVersion) } // OnChanOpenAck implements the IBCModule interface. func (im IBCMiddleware) OnChanOpenAck( ctx sdk.Context, portID, channelID string, counterpartyChannelID string, counterpartyVersion string, ) error { return im.app.OnChanOpenAck(ctx, portID, channelID, counterpartyChannelID, counterpartyVersion) } // OnChanOpenConfirm implements the IBCModule interface. func (im IBCMiddleware) OnChanOpenConfirm(ctx sdk.Context, portID, channelID string) error { return im.app.OnChanOpenConfirm(ctx, portID, channelID) } // OnChanCloseInit implements the IBCModule interface. func (im IBCMiddleware) OnChanCloseInit(ctx sdk.Context, portID, channelID string) error { return im.app.OnChanCloseInit(ctx, portID, channelID) } // OnChanCloseConfirm implements the IBCModule interface. func (im IBCMiddleware) OnChanCloseConfirm(ctx sdk.Context, portID, channelID string) error { return im.app.OnChanCloseConfirm(ctx, portID, channelID) } // OnRecvPacket checks the memo field on this packet and if the memo indicates this packet // should be handled by the ibc composability middleware, it updates the memo according to the payload func (im IBCMiddleware) OnRecvPacket( ctx sdk.Context, packet channeltypes.Packet, relayer sdk.AccAddress, ) ibcexported.Acknowledgement { packet, ackErr := im.keeper.OnRecvPacket(ctx, packet) if ackErr != nil { return ackErr } return im.app.OnRecvPacket(ctx, packet, relayer) } // OnAcknowledgementPacket implements the IBCModule interface. func (im IBCMiddleware) OnAcknowledgementPacket( ctx sdk.Context, packet channeltypes.Packet, acknowledgement []byte, relayer sdk.AccAddress, ) error { return im.app.OnAcknowledgementPacket(ctx, packet, acknowledgement, relayer) } // OnTimeoutPacket implements the IBCModule interface. func (im IBCMiddleware) OnTimeoutPacket(ctx sdk.Context, packet channeltypes.Packet, relayer sdk.AccAddress) error { return im.app.OnTimeoutPacket(ctx, packet, relayer) } // SendPacket implements the ICS4 Wrapper interface. func (im IBCMiddleware) SendPacket( ctx sdk.Context, chanCap *capabilitytypes.Capability, packet ibcexported.PacketI, ) error { return im.ics4.SendPacket(ctx, chanCap, packet) } // WriteAcknowledgement implements the ICS4 Wrapper interface. func (im IBCMiddleware) WriteAcknowledgement( ctx sdk.Context, chanCap *capabilitytypes.Capability, packet ibcexported.PacketI, ack ibcexported.Acknowledgement, ) error { return im.ics4.WriteAcknowledgement(ctx, chanCap, packet, ack) } func (im IBCMiddleware) GetAppVersion(ctx sdk.Context, portID string, channelID string) (string, bool) { return im.ics4.GetAppVersion(ctx, portID, channelID) }