diff --git a/x/inter-tx/ibc_module.go b/x/inter-tx/ibc_module.go index 7430813e..d67604e3 100644 --- a/x/inter-tx/ibc_module.go +++ b/x/inter-tx/ibc_module.go @@ -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" @@ -109,7 +113,31 @@ 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) { + case 0: + // TODO: handle for sdk 0.46.x + return nil + default: + for _, msgData := range txMsgData.Data { + response, err := handleMsgData(ctx, msgData) + if err != nil { + return err + } + + im.keeper.Logger(ctx).Info("message response in ICS-27 packet response", "response", response) + } + return nil + } } // OnTimeoutPacket implements the IBCModule interface. @@ -132,3 +160,20 @@ func (im IBCModule) NegotiateAppVersion( ) (string, error) { return "", nil } + +func handleMsgData(ctx sdk.Context, msgData *sdk.MsgData) (string, error) { + switch msgData.MsgType { + case sdk.MsgTypeURL(&banktypes.MsgSend{}): + 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 + + // TODO: handle other messages + + default: + return "", nil + } +} diff --git a/x/inter-tx/keeper/keeper.go b/x/inter-tx/keeper/keeper.go index f789a577..70031538 100644 --- a/x/inter-tx/keeper/keeper.go +++ b/x/inter-tx/keeper/keeper.go @@ -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 { @@ -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)