141 lines
4.4 KiB
Go
141 lines
4.4 KiB
Go
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)
|
|
}
|