diff --git a/testing/mock/ibc_app_v2.go b/testing/mock/ibc_app_v2.go new file mode 100644 index 00000000000..f3630a5d9a4 --- /dev/null +++ b/testing/mock/ibc_app_v2.go @@ -0,0 +1,48 @@ +package mock + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + + channeltypes "github.com/cosmos/ibc-go/v9/modules/core/04-channel/types" +) + +// IBCAppV2 contains IBCModuleV2 application module callbacks as defined in 05-port. +type IBCAppV2 struct { + OnSendPacketV2 func( + ctx context.Context, + sourceID string, + sequence uint64, + timeoutTimestamp uint64, + payload channeltypes.Payload, + signer sdk.AccAddress, + ) error + + OnRecvPacketV2 func( + ctx context.Context, + packet channeltypes.PacketV2, + payload channeltypes.Payload, + relayer sdk.AccAddress, + ) channeltypes.RecvPacketResult + + OnAcknowledgementPacketV2 func( + ctx context.Context, + packet channeltypes.PacketV2, + payload channeltypes.Payload, + recvPacketResult channeltypes.RecvPacketResult, + relayer sdk.AccAddress, + ) error + + OnTimeoutPacketV2 func( + ctx context.Context, + packet channeltypes.PacketV2, + payload channeltypes.Payload, + relayer sdk.AccAddress, + ) error +} + +// NewIBCV2App returns a IBCAppV2. +func NewIBCV2App() *IBCAppV2 { + return &IBCAppV2{} +} diff --git a/testing/mock/ibc_module_v2.go b/testing/mock/ibc_module_v2.go new file mode 100644 index 00000000000..37886b988e6 --- /dev/null +++ b/testing/mock/ibc_module_v2.go @@ -0,0 +1,79 @@ +package mock + +import ( + "bytes" + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + + channeltypes "github.com/cosmos/ibc-go/v9/modules/core/04-channel/types" + porttypes "github.com/cosmos/ibc-go/v9/modules/core/05-port/types" +) + +var _ porttypes.IBCModuleV2 = (*IBCModuleV2)(nil) + +// IBCModuleV2 implements the IBCModuleV2 interface for testing v2 of the IBC module. +type IBCModuleV2 struct { + IBCApp *IBCAppV2 // base application of an IBC middleware stack +} + +func (im IBCModuleV2) OnSendPacketV2(ctx context.Context, sourceID string, sequence uint64, timeoutTimestamp uint64, payload channeltypes.Payload, signer sdk.AccAddress) error { + if im.IBCApp.OnSendPacketV2 != nil { + return im.IBCApp.OnSendPacketV2(ctx, sourceID, sequence, timeoutTimestamp, payload, signer) + } + + return nil +} + +func (im IBCModuleV2) OnRecvPacketV2(ctx context.Context, packet channeltypes.PacketV2, payload channeltypes.Payload, relayer sdk.AccAddress) channeltypes.RecvPacketResult { + if im.IBCApp.OnRecvPacketV2 != nil { + return im.IBCApp.OnRecvPacketV2(ctx, packet, payload, relayer) + } + + sdkCtx := sdk.UnwrapSDKContext(ctx) + sdkCtx.EventManager().EmitEvent(NewMockRecvPacketEvent()) + + status := channeltypes.PacketStatus_Success + ack := MockAcknowledgement.Acknowledgement() + + if bytes.Equal(payload.Value, MockFailPacketData) { + status = channeltypes.PacketStatus_Failure + ack = MockFailAcknowledgement.Acknowledgement() + } else if bytes.Equal(payload.Value, MockAsyncPacketData) { + status = channeltypes.PacketStatus_Async + ack = nil + } + + return channeltypes.RecvPacketResult{ + Status: status, + Acknowledgement: ack, + } +} + +func (im IBCModuleV2) OnAcknowledgementPacketV2(ctx context.Context, packet channeltypes.PacketV2, payload channeltypes.Payload, recvPacketResult channeltypes.RecvPacketResult, relayer sdk.AccAddress) error { + if im.IBCApp.OnAcknowledgementPacketV2 != nil { + return im.IBCApp.OnAcknowledgementPacketV2(ctx, packet, payload, recvPacketResult, relayer) + } + + sdkCtx := sdk.UnwrapSDKContext(ctx) + sdkCtx.EventManager().EmitEvent(NewMockAckPacketEvent()) + return nil +} + +func (im IBCModuleV2) OnTimeoutPacketV2(ctx context.Context, packet channeltypes.PacketV2, payload channeltypes.Payload, relayer sdk.AccAddress) error { + if im.IBCApp.OnTimeoutPacketV2 != nil { + return im.IBCApp.OnTimeoutPacketV2(ctx, packet, payload, relayer) + } + + sdkCtx := sdk.UnwrapSDKContext(ctx) + sdkCtx.EventManager().EmitEvent(NewMockTimeoutPacketEvent()) + + return nil +} + +// NewIBCModuleV2 creates a new IBCModule given the underlying mock IBC application and scopedKeeper. +func NewIBCModuleV2(app *IBCAppV2) IBCModuleV2 { + return IBCModuleV2{ + IBCApp: app, + } +}