diff --git a/x/wasm/ibc.go b/x/wasm/ibc.go index 347a3c2eaa..b1a3e81a83 100644 --- a/x/wasm/ibc.go +++ b/x/wasm/ibc.go @@ -75,6 +75,9 @@ func (i IBCHandler) OnChanOpenInit( return "", err } if acceptedVersion == "" { // accept incoming version when nothing returned by contract + if version == "" { + return "", types.ErrEmpty.Wrap("version") + } acceptedVersion = version } diff --git a/x/wasm/ibc_integration_test.go b/x/wasm/ibc_integration_test.go index 689c12b3f9..eca8ca1ac1 100644 --- a/x/wasm/ibc_integration_test.go +++ b/x/wasm/ibc_integration_test.go @@ -22,21 +22,31 @@ import ( ) func TestOnChanOpenInitVersion(t *testing.T) { - const startVersion = "v1" + const v1 = "v1" specs := map[string]struct { - contractRsp *wasmvmtypes.IBC3ChannelOpenResponse - expVersion string + startVersion string + contractRsp *wasmvmtypes.IBC3ChannelOpenResponse + expVersion string + expErr bool }{ "different version": { - contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{Version: "v2"}, - expVersion: "v2", + startVersion: v1, + contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{Version: "v2"}, + expVersion: "v2", }, "no response": { - expVersion: startVersion, + startVersion: v1, + expVersion: v1, }, "empty result": { - contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{}, - expVersion: startVersion, + startVersion: v1, + contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{}, + expVersion: v1, + }, + "empty versions should fail": { + startVersion: "", + contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{}, + expErr: true, }, } for name, spec := range specs { @@ -63,10 +73,17 @@ func TestOnChanOpenInitVersion(t *testing.T) { coordinator.CreateConnections(path) path.EndpointA.ChannelConfig = &ibctesting.ChannelConfig{ PortID: contractInfo.IBCPortID, - Version: startVersion, + Version: spec.startVersion, Order: channeltypes.UNORDERED, } - require.NoError(t, path.EndpointA.ChanOpenInit()) + // when + gotErr := path.EndpointA.ChanOpenInit() + // then + if spec.expErr { + require.Error(t, gotErr) + return + } + require.NoError(t, gotErr) assert.Equal(t, spec.expVersion, path.EndpointA.ChannelConfig.Version) }) }