From 76a5053fa6e0a26db3c39a4ebf082b8870dde96d Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Mon, 16 May 2022 15:42:59 +0200 Subject: [PATCH] Expose ibc v3 entry points --- x/wasm/ibc.go | 19 +++++++++++-------- x/wasm/keeper/relay.go | 16 ++++++++++------ x/wasm/keeper/relay_test.go | 2 +- x/wasm/types/exported_keepers.go | 2 +- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/x/wasm/ibc.go b/x/wasm/ibc.go index 6c138e9ab8..4d99b0f244 100644 --- a/x/wasm/ibc.go +++ b/x/wasm/ibc.go @@ -59,7 +59,7 @@ func (i IBCHandler) OnChanOpenInit( }, }, } - err = i.keeper.OnOpenChannel(ctx, contractAddr, msg) + _, err = i.keeper.OnOpenChannel(ctx, contractAddr, msg) if err != nil { return err } @@ -103,11 +103,15 @@ func (i IBCHandler) OnChanOpenTry( }, } - // DESIGN V3: Allow contracts to return a version (or default to counterpartyVersion if unset) - err = i.keeper.OnOpenChannel(ctx, contractAddr, msg) + // Allow contracts to return a version (or default to counterpartyVersion if unset) + version, err := i.keeper.OnOpenChannel(ctx, contractAddr, msg) if err != nil { return "", err } + if version == "" { + version = counterpartyVersion + } + // Module may have already claimed capability in OnChanOpenInit in the case of crossing hellos // (ie chainA and chainB both call ChanOpenInit before one of them calls ChanOpenTry) // If module can already authenticate the capability then module already owns it so we don't need to claim @@ -119,9 +123,7 @@ func (i IBCHandler) OnChanOpenTry( } } - // In the future, we can negotiate (see design comment above), but for now, we only error if we disagee - // with the proposed version - return counterpartyVersion, nil + return version, nil } // OnChanOpenAck implements the IBCModule interface @@ -240,7 +242,7 @@ func (i IBCHandler) OnRecvPacket( if err != nil { return channeltypes.NewErrorAcknowledgement(sdkerrors.Wrapf(err, "contract port id").Error()) } - msg := wasmvmtypes.IBCPacketReceiveMsg{Packet: newIBCPacket(packet)} + msg := wasmvmtypes.IBCPacketReceiveMsg{Packet: newIBCPacket(packet), Relayer: relayer.String()} ack, err := i.keeper.OnRecvPacket(ctx, contractAddr, msg) if err != nil { return channeltypes.NewErrorAcknowledgement(err.Error()) @@ -275,6 +277,7 @@ func (i IBCHandler) OnAcknowledgementPacket( err = i.keeper.OnAckPacket(ctx, contractAddr, wasmvmtypes.IBCPacketAckMsg{ Acknowledgement: wasmvmtypes.IBCAcknowledgement{Data: acknowledgement}, OriginalPacket: newIBCPacket(packet), + Relayer: relayer.String(), }) if err != nil { return sdkerrors.Wrap(err, "on ack") @@ -288,7 +291,7 @@ func (i IBCHandler) OnTimeoutPacket(ctx sdk.Context, packet channeltypes.Packet, if err != nil { return sdkerrors.Wrapf(err, "contract port id") } - msg := wasmvmtypes.IBCPacketTimeoutMsg{Packet: newIBCPacket(packet)} + msg := wasmvmtypes.IBCPacketTimeoutMsg{Packet: newIBCPacket(packet), Relayer: relayer.String()} err = i.keeper.OnTimeoutPacket(ctx, contractAddr, msg) if err != nil { return sdkerrors.Wrap(err, "on timeout") diff --git a/x/wasm/keeper/relay.go b/x/wasm/keeper/relay.go index 41553bbdb4..5a74ebe2ca 100644 --- a/x/wasm/keeper/relay.go +++ b/x/wasm/keeper/relay.go @@ -22,26 +22,30 @@ func (k Keeper) OnOpenChannel( ctx sdk.Context, contractAddr sdk.AccAddress, msg wasmvmtypes.IBCChannelOpenMsg, -) error { +) (string, error) { defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "ibc-open-channel") + version := "" _, codeInfo, prefixStore, err := k.contractInstance(ctx, contractAddr) if err != nil { - return err + return "", err } env := types.NewEnv(ctx, contractAddr) querier := k.newQueryHandler(ctx, contractAddr) gas := k.runtimeGasForContract(ctx) - // TODO: we probably want to use the response somehow - _, gasUsed, execErr := k.wasmVM.IBCChannelOpen(codeInfo.CodeHash, env, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gas, costJSONDeserialization) + res, gasUsed, execErr := k.wasmVM.IBCChannelOpen(codeInfo.CodeHash, env, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gas, costJSONDeserialization) k.consumeRuntimeGas(ctx, gasUsed) if execErr != nil { - return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) + return "", sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) + } + + if res != nil { + version = res.Version } - return nil + return version, nil } // OnConnectChannel calls the contract to let it know the IBC channel was established. diff --git a/x/wasm/keeper/relay_test.go b/x/wasm/keeper/relay_test.go index a1726b9a63..e6ed619606 100644 --- a/x/wasm/keeper/relay_test.go +++ b/x/wasm/keeper/relay_test.go @@ -72,7 +72,7 @@ func TestOnOpenChannel(t *testing.T) { CounterpartyVersion: "foo", }, } - err := keepers.WasmKeeper.OnOpenChannel(ctx, spec.contractAddr, msg) + _, err := keepers.WasmKeeper.OnOpenChannel(ctx, spec.contractAddr, msg) // then if spec.expErr { diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go index c48a3615c5..bb919a3189 100644 --- a/x/wasm/types/exported_keepers.go +++ b/x/wasm/types/exported_keepers.go @@ -64,7 +64,7 @@ type IBCContractKeeper interface { ctx sdk.Context, contractAddr sdk.AccAddress, msg wasmvmtypes.IBCChannelOpenMsg, - ) error + ) (string, error) OnConnectChannel( ctx sdk.Context, contractAddr sdk.AccAddress,