Skip to content
This repository has been archived by the owner on Sep 20, 2023. It is now read-only.

add example of handling acknowledgement #88

Merged
merged 12 commits into from
Mar 20, 2022
46 changes: 45 additions & 1 deletion x/inter-tx/ibc_module.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package inter_tx

import (
proto "github.com/gogo/protobuf/proto"

sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
"github.com/cosmos/interchain-accounts/x/inter-tx/keeper"

Expand Down Expand Up @@ -109,7 +113,29 @@ func (im IBCModule) OnAcknowledgementPacket(
acknowledgement []byte,
relayer sdk.AccAddress,
) error {
return nil
var ack channeltypes.Acknowledgement
if err := channeltypes.SubModuleCdc.UnmarshalJSON(acknowledgement, &ack); err != nil {
return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal ICS-27 packet acknowledgement: %v", err)
}

txMsgData := &sdk.TxMsgData{}
if err := proto.Unmarshal(ack.GetResult(), txMsgData); err != nil {
return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "cannot unmarshal ICS-27 tx message data: %v", err)
}
switch len(txMsgData.Data) {
crodriguezvega marked this conversation as resolved.
Show resolved Hide resolved
case 0:
// TODO: handle for sdk 0.44.x
return nil
default:
for _, msgData := range txMsgData.Data {
if response, err := handleMsgData(ctx, msgData); err != nil {
return err
} else {
im.keeper.Logger(ctx).Info("message response in ICS-27 packet response", "response", response)
}
crodriguezvega marked this conversation as resolved.
Show resolved Hide resolved
}
return nil
}
}

// OnTimeoutPacket implements the IBCModule interface.
Expand All @@ -132,3 +158,21 @@ func (im IBCModule) NegotiateAppVersion(
) (string, error) {
return "", nil
}

func handleMsgData(ctx sdk.Context, msgData *sdk.MsgData) (string, error) {
sdkMsgs := []sdk.Msg{&banktypes.MsgSend{}}

switch msgData.MsgType {
case sdk.MsgTypeURL(sdkMsgs[0]):
msgResponse := &banktypes.MsgSendResponse{}
if err := proto.Unmarshal(msgData.Data, msgResponse); err != nil {
return "", sdkerrors.Wrapf(sdkerrors.ErrJSONUnmarshal, "cannot unmarshal send response message: %s", err.Error())
}
return msgResponse.String(), nil
crodriguezvega marked this conversation as resolved.
Show resolved Hide resolved

// TODO: handle other messages

default:
return "", nil
}
}
10 changes: 10 additions & 0 deletions x/inter-tx/keeper/keeper.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package keeper

import (
"fmt"

"github.com/tendermint/tendermint/libs/log"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"

icacontrollerkeeper "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/controller/keeper"
host "github.com/cosmos/ibc-go/v3/modules/core/24-host"
"github.com/cosmos/interchain-accounts/x/inter-tx/types"
)

type Keeper struct {
Expand All @@ -28,6 +33,11 @@ func NewKeeper(cdc codec.Codec, storeKey sdk.StoreKey, iaKeeper icacontrollerkee
}
}

// Logger returns the application logger, scoped to the associated module
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
return ctx.Logger().With("module", fmt.Sprintf("x/%s-%s", host.ModuleName, types.ModuleName))
}

// ClaimCapability claims the channel capability passed via the OnOpenChanInit callback
func (k *Keeper) ClaimCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string) error {
return k.scopedKeeper.ClaimCapability(ctx, cap, name)
Expand Down