diff --git a/x/oracle/keeper/historic_price.go b/x/oracle/keeper/historic_price.go index 0ddde0db2e..c09903dc0b 100644 --- a/x/oracle/keeper/historic_price.go +++ b/x/oracle/keeper/historic_price.go @@ -45,7 +45,7 @@ func (k Keeper) CalcAndSetHistoricMedian( median, err := decmath.Median(historicPrices) if err != nil { - return errors.Wrap(err, "denom: "+denom) //nolint: goconst + return errors.Wrap(err, "denom: "+denom) } block := uint64(ctx.BlockHeight()) diff --git a/x/uibc/gmp/gmp_middleware.go b/x/uibc/gmp/gmp_middleware.go index 7509cf2549..dd9746138d 100644 --- a/x/uibc/gmp/gmp_middleware.go +++ b/x/uibc/gmp/gmp_middleware.go @@ -2,73 +2,29 @@ package gmp import ( "encoding/json" + "fmt" sdk "github.com/cosmos/cosmos-sdk/types" ) -type Handler struct { -} - -func NewHandler() *Handler { - return &Handler{} -} - -func (h Handler) OnRecvPacket(ctx sdk.Context, coinReceived sdk.Coin, memo string, receiver sdk.AccAddress, -) error { +// PaseMemo will parse the incoming gmp memo +func ParseMemo(ctx sdk.Context, coinReceived sdk.Coin, memo string, receiver sdk.AccAddress) (Memo, error) { if len(memo) == 0 { - return nil + return Memo{}, nil } - logger := ctx.Logger().With("handler", "gmp_handler") - var msg Message - var err error - - if err = json.Unmarshal([]byte(memo), &msg); err != nil { - logger.Error("cannot unmarshal memo", "err", err) - return err + var msg Memo + if err := json.Unmarshal([]byte(memo), &msg); err != nil { + return msg, err } switch msg.Type { case TypeGeneralMessage: - err := h.HandleGeneralMessage(ctx, msg.SourceAddress, msg.SourceAddress, receiver, msg.Payload) - if err != nil { - logger.Error("err at HandleGeneralMessage", err) - } + return msg, fmt.Errorf("msg.type=%d (TypeGeneralMessage) is not supported. Supported types include: %d", + TypeGeneralMessage, TypeGeneralMessageWithToken) case TypeGeneralMessageWithToken: - err := h.HandleGeneralMessageWithToken( - ctx, msg.SourceAddress, msg.SourceAddress, receiver, msg.Payload, coinReceived) - if err != nil { - logger.Error("err at HandleGeneralMessageWithToken", err) - } + return msg, nil default: - logger.Error("unrecognized gmp message type: %d", msg.Type) + return msg, fmt.Errorf("unrecognized gmp message type: %d", msg.Type) } - - return err -} - -func (h Handler) HandleGeneralMessage(ctx sdk.Context, srcChain, srcAddress string, receiver sdk.AccAddress, - payload []byte) error { - ctx.Logger().Info("HandleGeneralMessage called", - "srcChain", srcChain, - "srcAddress", srcAddress, - "receiver", receiver, - "payload", payload, - "handler", "gmp-handler", - ) - return nil -} - -func (h Handler) HandleGeneralMessageWithToken(ctx sdk.Context, srcChain, srcAddress string, - receiver sdk.AccAddress, payload []byte, coin sdk.Coin) error { - - ctx.Logger().Info("HandleGeneralMessageWithToken called", - "srcChain", srcChain, - "srcAddress", srcAddress, - "receiver", receiver, - "payload", payload, - "coin", coin, - "handler", "gmp-token-handler", - ) - return nil } diff --git a/x/uibc/gmp/gmp_middleware_test.go b/x/uibc/gmp/gmp_middleware_test.go index e77ad66469..8101c750ad 100644 --- a/x/uibc/gmp/gmp_middleware_test.go +++ b/x/uibc/gmp/gmp_middleware_test.go @@ -11,7 +11,6 @@ import ( ) func TestGmpMemoHandler(t *testing.T) { - gmpHandler := NewHandler() logger := log.NewNopLogger() ctx := sdk.NewContext(nil, tmproto.Header{}, false, logger) @@ -20,6 +19,13 @@ func TestGmpMemoHandler(t *testing.T) { memo func() string errMsg string }{ + { + name: "empty memo", + memo: func() string { + return "" + }, + errMsg: "", + }, { name: "invalid memo", memo: func() string { @@ -28,9 +34,24 @@ func TestGmpMemoHandler(t *testing.T) { errMsg: "invalid character", }, { - name: "valid memo", + name: "unsupport msg", memo: func() string { - validMemo := Message{ + validMemo := Memo{ + SourceChain: "source_chain", + SourceAddress: "source_addr", + Payload: nil, + Type: int64(4), + } + m, err := json.Marshal(validMemo) + assert.NilError(t, err) + return string(m) + }, + errMsg: "unrecognized gmp message type", + }, + { + name: "unsupport msg", + memo: func() string { + validMemo := Memo{ SourceChain: "source_chain", SourceAddress: "source_addr", Payload: nil, @@ -40,13 +61,28 @@ func TestGmpMemoHandler(t *testing.T) { assert.NilError(t, err) return string(m) }, + errMsg: "msg.type=1 (TypeGeneralMessage) is not supported. Supported types include: 2", + }, + { + name: "valid memo", + memo: func() string { + validMemo := Memo{ + SourceChain: "source_chain", + SourceAddress: "source_addr", + Payload: nil, + Type: int64(2), + } + m, err := json.Marshal(validMemo) + assert.NilError(t, err) + return string(m) + }, errMsg: "", }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - err := gmpHandler.OnRecvPacket(ctx, sdk.Coin{}, tc.memo(), nil) + _, err := ParseMemo(ctx, sdk.Coin{}, tc.memo(), nil) if len(tc.errMsg) != 0 { assert.ErrorContains(t, err, tc.errMsg) } else { diff --git a/x/uibc/gmp/types.go b/x/uibc/gmp/types.go index 358a3a81e1..65e20a2361 100644 --- a/x/uibc/gmp/types.go +++ b/x/uibc/gmp/types.go @@ -15,8 +15,8 @@ const ( TypeSendToken ) -// Message is attached in ICS20 packet memo field -type Message struct { +// Memo is attached in ICS20 packet memo field +type Memo struct { SourceChain string `json:"source_chain"` SourceAddress string `json:"source_address"` Payload []byte `json:"payload"` diff --git a/x/uibc/uics20/memo_handler.go b/x/uibc/uics20/memo_handler.go index a9fafd4ab3..d8ec86d66d 100644 --- a/x/uibc/uics20/memo_handler.go +++ b/x/uibc/uics20/memo_handler.go @@ -46,6 +46,7 @@ func (mh *MemoHandler) onRecvPacketPrepare( ) ([]string, error) { var events []string var err error + logger := recvPacketLogger(ctx) mh.memo = ftData.Memo amount, ok := sdk.NewIntFromString(ftData.Amount) if !ok { // must not happen @@ -58,15 +59,22 @@ func (mh *MemoHandler) onRecvPacketPrepare( return nil, sdkerrors.Wrap(err, "can't parse ftData.Receiver bech32 address") } + var memoPayload []byte if strings.EqualFold(ftData.Sender, gmp.DefaultGMPAddress) { - events = append(events, "axelar GMP transaction") + events = append(events, "Axelar GMP") mh.isGMP = true - return events, nil + gmpMessage, err := gmp.ParseMemo(*ctx, mh.received, mh.memo, mh.receiver) + if err != nil { + logger.Debug("Can't parse the gmp memo", "err", err) + return events, errMemoValidation{err} + } + memoPayload = gmpMessage.Payload + } else { + memoPayload = []byte(ftData.Memo) } - - memo, err := deserializeMemo(mh.cdc, []byte(ftData.Memo)) + memo, err := deserializeMemo(mh.cdc, memoPayload) if err != nil { - recvPacketLogger(ctx).Debug("Not recognized ICS20 memo, ignoring hook execution", "err", err) + logger.Debug("Not recognized ICS20 memo, ignoring hook execution", "err", err) return nil, nil } if memo.FallbackAddr != "" { @@ -104,16 +112,11 @@ func (mh MemoHandler) execute(ctx *sdk.Context) error { return errHooksDisabled } - logger := recvPacketLogger(ctx) - if mh.isGMP { - gh := gmp.NewHandler() - return gh.OnRecvPacket(*ctx, mh.received, mh.memo, mh.receiver) - } - if len(mh.msgs) == 0 { return nil // quick return - we have nothing to handle } + logger := recvPacketLogger(ctx) for _, m := range mh.msgs { if err := mh.handleMemoMsg(ctx, m); err != nil { return sdkerrors.Wrapf(err, "error dispatching msg: %v", m)