From 4b1f90a1832359d8a2a11c17c76a0682a2a795f2 Mon Sep 17 00:00:00 2001 From: Sai Kumar Date: Thu, 28 Mar 2024 18:15:25 +0530 Subject: [PATCH 1/5] handle gmp message --- x/uibc/gmp/gmp_middleware.go | 53 ++++++------------------------- x/uibc/gmp/gmp_middleware_test.go | 19 +++++++++-- x/uibc/uics20/memo_handler.go | 21 ++++++++---- 3 files changed, 41 insertions(+), 52 deletions(-) diff --git a/x/uibc/gmp/gmp_middleware.go b/x/uibc/gmp/gmp_middleware.go index 7509cf2549..c0e200835f 100644 --- a/x/uibc/gmp/gmp_middleware.go +++ b/x/uibc/gmp/gmp_middleware.go @@ -2,6 +2,7 @@ package gmp import ( "encoding/json" + "fmt" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -13,62 +14,28 @@ func NewHandler() *Handler { return &Handler{} } -func (h Handler) OnRecvPacket(ctx sdk.Context, coinReceived sdk.Coin, memo string, receiver sdk.AccAddress, -) error { - if len(memo) == 0 { - return nil +func (h Handler) OnRecvPacket(ctx sdk.Context, coinReceived sdk.Coin, memoStr string, receiver sdk.AccAddress, +) (Message, error) { + if len(memoStr) == 0 { + return Message{}, nil } logger := ctx.Logger().With("handler", "gmp_handler") var msg Message var err error - if err = json.Unmarshal([]byte(memo), &msg); err != nil { + if err = json.Unmarshal([]byte(memoStr), &msg); err != nil { logger.Error("cannot unmarshal memo", "err", err) - return err + return Message{}, 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("we are not supporting general message: %d", msg.Type) 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..6dd025e2a4 100644 --- a/x/uibc/gmp/gmp_middleware_test.go +++ b/x/uibc/gmp/gmp_middleware_test.go @@ -28,7 +28,7 @@ func TestGmpMemoHandler(t *testing.T) { errMsg: "invalid character", }, { - name: "valid memo", + name: "not supporting the msg", memo: func() string { validMemo := Message{ SourceChain: "source_chain", @@ -40,13 +40,28 @@ func TestGmpMemoHandler(t *testing.T) { assert.NilError(t, err) return string(m) }, + errMsg: "we are not supporting general message", + }, + { + name: "valid memo", + memo: func() string { + validMemo := Message{ + 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 := gmpHandler.OnRecvPacket(ctx, sdk.Coin{}, tc.memo(), nil) if len(tc.errMsg) != 0 { assert.ErrorContains(t, err, tc.errMsg) } else { diff --git a/x/uibc/uics20/memo_handler.go b/x/uibc/uics20/memo_handler.go index a9fafd4ab3..7e922a4ee9 100644 --- a/x/uibc/uics20/memo_handler.go +++ b/x/uibc/uics20/memo_handler.go @@ -58,13 +58,20 @@ 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") mh.isGMP = true - return events, nil + gh := gmp.NewHandler() + gmpMessage, err := gh.OnRecvPacket(*ctx, mh.received, mh.memo, mh.receiver) + if err != nil { + return events, 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) return nil, nil @@ -105,10 +112,10 @@ func (mh MemoHandler) execute(ctx *sdk.Context) error { } logger := recvPacketLogger(ctx) - if mh.isGMP { - gh := gmp.NewHandler() - return gh.OnRecvPacket(*ctx, mh.received, mh.memo, mh.receiver) - } + // if mh.isGMP { + // gh := gmp.NewHandler(mh.cdc) + // return gh.OnRecvPacket(ctx, mh.received, mh.memo, mh.receiver) + // } if len(mh.msgs) == 0 { return nil // quick return - we have nothing to handle From 623ec282a4e46f929d193b7a874a4054fffd2f14 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 3 Apr 2024 13:16:00 +0200 Subject: [PATCH 2/5] cosmetic --- x/uibc/gmp/gmp_middleware.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/x/uibc/gmp/gmp_middleware.go b/x/uibc/gmp/gmp_middleware.go index c0e200835f..58ec8cc94f 100644 --- a/x/uibc/gmp/gmp_middleware.go +++ b/x/uibc/gmp/gmp_middleware.go @@ -20,22 +20,18 @@ func (h Handler) OnRecvPacket(ctx sdk.Context, coinReceived sdk.Coin, memoStr st return Message{}, nil } - logger := ctx.Logger().With("handler", "gmp_handler") var msg Message - var err error - - if err = json.Unmarshal([]byte(memoStr), &msg); err != nil { - logger.Error("cannot unmarshal memo", "err", err) - return Message{}, err + if err := json.Unmarshal([]byte(memoStr), &msg); err != nil { + return msg, err } switch msg.Type { case TypeGeneralMessage: - return msg, fmt.Errorf("we are not supporting general message: %d", msg.Type) + return msg, fmt.Errorf("only msg.type=%d (TypeGeneralMessageWithToken) is supported", + TypeGeneralMessageWithToken) case TypeGeneralMessageWithToken: return msg, nil default: - logger.Error("unrecognized gmp message type: %d", msg.Type) return msg, fmt.Errorf("unrecognized gmp message type: %d", msg.Type) } } From 5c28e718f645290b43649ce2529f44ecd3e8f9af Mon Sep 17 00:00:00 2001 From: Sai Kumar Date: Wed, 3 Apr 2024 18:49:57 +0530 Subject: [PATCH 3/5] address the review comments --- x/uibc/gmp/gmp_middleware.go | 12 ++++++------ x/uibc/gmp/gmp_middleware_test.go | 32 ++++++++++++++++++++++++++----- x/uibc/gmp/types.go | 4 ++-- x/uibc/uics20/memo_handler.go | 17 +++++++--------- 4 files changed, 42 insertions(+), 23 deletions(-) diff --git a/x/uibc/gmp/gmp_middleware.go b/x/uibc/gmp/gmp_middleware.go index 58ec8cc94f..9a8d2cbca1 100644 --- a/x/uibc/gmp/gmp_middleware.go +++ b/x/uibc/gmp/gmp_middleware.go @@ -14,14 +14,14 @@ func NewHandler() *Handler { return &Handler{} } -func (h Handler) OnRecvPacket(ctx sdk.Context, coinReceived sdk.Coin, memoStr string, receiver sdk.AccAddress, -) (Message, error) { - if len(memoStr) == 0 { - return Message{}, nil +func (h Handler) ParseMemo(ctx sdk.Context, coinReceived sdk.Coin, memo string, receiver sdk.AccAddress, +) (GMPMemo, error) { + if len(memo) == 0 { + return GMPMemo{}, nil } - var msg Message - if err := json.Unmarshal([]byte(memoStr), &msg); err != nil { + var msg GMPMemo + if err := json.Unmarshal([]byte(memo), &msg); err != nil { return msg, err } diff --git a/x/uibc/gmp/gmp_middleware_test.go b/x/uibc/gmp/gmp_middleware_test.go index 6dd025e2a4..7b1132a434 100644 --- a/x/uibc/gmp/gmp_middleware_test.go +++ b/x/uibc/gmp/gmp_middleware_test.go @@ -20,6 +20,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 +35,24 @@ func TestGmpMemoHandler(t *testing.T) { errMsg: "invalid character", }, { - name: "not supporting the msg", + name: "unsupport msg", + memo: func() string { + validMemo := GMPMemo{ + 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 := Message{ + validMemo := GMPMemo{ SourceChain: "source_chain", SourceAddress: "source_addr", Payload: nil, @@ -40,12 +62,12 @@ func TestGmpMemoHandler(t *testing.T) { assert.NilError(t, err) return string(m) }, - errMsg: "we are not supporting general message", + errMsg: "only msg.type=2 (TypeGeneralMessageWithToken) is supported", }, { name: "valid memo", memo: func() string { - validMemo := Message{ + validMemo := GMPMemo{ SourceChain: "source_chain", SourceAddress: "source_addr", Payload: nil, @@ -61,7 +83,7 @@ func TestGmpMemoHandler(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - _, err := gmpHandler.OnRecvPacket(ctx, sdk.Coin{}, tc.memo(), nil) + _, err := gmpHandler.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..4da7eb77b9 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 { +// GMPMemo is attached in ICS20 packet memo field +type GMPMemo 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 7e922a4ee9..e90ce89ac1 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 @@ -60,12 +61,13 @@ func (mh *MemoHandler) onRecvPacketPrepare( var memoPayload []byte if strings.EqualFold(ftData.Sender, gmp.DefaultGMPAddress) { - events = append(events, "axelar GMP transaction") + events = append(events, "Axelar GMP") mh.isGMP = true gh := gmp.NewHandler() - gmpMessage, err := gh.OnRecvPacket(*ctx, mh.received, mh.memo, mh.receiver) + gmpMessage, err := gh.ParseMemo(*ctx, mh.received, mh.memo, mh.receiver) if err != nil { - return events, err + logger.Debug("Can't parse the gmp memo", "err", err) + return events, errMemoValidation{err} } memoPayload = gmpMessage.Payload } else { @@ -73,7 +75,7 @@ func (mh *MemoHandler) onRecvPacketPrepare( } 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 != "" { @@ -111,16 +113,11 @@ func (mh MemoHandler) execute(ctx *sdk.Context) error { return errHooksDisabled } - logger := recvPacketLogger(ctx) - // if mh.isGMP { - // gh := gmp.NewHandler(mh.cdc) - // 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) From 330efe39f25ddf15a9449e8b8d01d08e33689e6f Mon Sep 17 00:00:00 2001 From: Sai Kumar Date: Wed, 3 Apr 2024 18:53:09 +0530 Subject: [PATCH 4/5] remove the gmp handler --- x/uibc/gmp/gmp_middleware.go | 11 ++--------- x/uibc/gmp/gmp_middleware_test.go | 3 +-- x/uibc/uics20/memo_handler.go | 3 +-- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/x/uibc/gmp/gmp_middleware.go b/x/uibc/gmp/gmp_middleware.go index 9a8d2cbca1..d990402f98 100644 --- a/x/uibc/gmp/gmp_middleware.go +++ b/x/uibc/gmp/gmp_middleware.go @@ -7,15 +7,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -type Handler struct { -} - -func NewHandler() *Handler { - return &Handler{} -} - -func (h Handler) ParseMemo(ctx sdk.Context, coinReceived sdk.Coin, memo string, receiver sdk.AccAddress, -) (GMPMemo, error) { +// PaseMemo will parse the incoming gmp memo +func ParseMemo(ctx sdk.Context, coinReceived sdk.Coin, memo string, receiver sdk.AccAddress) (GMPMemo, error) { if len(memo) == 0 { return GMPMemo{}, nil } diff --git a/x/uibc/gmp/gmp_middleware_test.go b/x/uibc/gmp/gmp_middleware_test.go index 7b1132a434..b2429ade21 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) @@ -83,7 +82,7 @@ func TestGmpMemoHandler(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - _, err := gmpHandler.ParseMemo(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/uics20/memo_handler.go b/x/uibc/uics20/memo_handler.go index e90ce89ac1..d8ec86d66d 100644 --- a/x/uibc/uics20/memo_handler.go +++ b/x/uibc/uics20/memo_handler.go @@ -63,8 +63,7 @@ func (mh *MemoHandler) onRecvPacketPrepare( if strings.EqualFold(ftData.Sender, gmp.DefaultGMPAddress) { events = append(events, "Axelar GMP") mh.isGMP = true - gh := gmp.NewHandler() - gmpMessage, err := gh.ParseMemo(*ctx, mh.received, mh.memo, mh.receiver) + 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} From 41b8c26b7fe4b11947309d0b205fc1c4a2034b04 Mon Sep 17 00:00:00 2001 From: Sai Kumar Date: Thu, 4 Apr 2024 14:06:58 +0530 Subject: [PATCH 5/5] ++ --- x/oracle/keeper/historic_price.go | 2 +- x/uibc/gmp/gmp_middleware.go | 10 +++++----- x/uibc/gmp/gmp_middleware_test.go | 8 ++++---- x/uibc/gmp/types.go | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) 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 d990402f98..dd9746138d 100644 --- a/x/uibc/gmp/gmp_middleware.go +++ b/x/uibc/gmp/gmp_middleware.go @@ -8,20 +8,20 @@ import ( ) // PaseMemo will parse the incoming gmp memo -func ParseMemo(ctx sdk.Context, coinReceived sdk.Coin, memo string, receiver sdk.AccAddress) (GMPMemo, error) { +func ParseMemo(ctx sdk.Context, coinReceived sdk.Coin, memo string, receiver sdk.AccAddress) (Memo, error) { if len(memo) == 0 { - return GMPMemo{}, nil + return Memo{}, nil } - var msg GMPMemo + var msg Memo if err := json.Unmarshal([]byte(memo), &msg); err != nil { return msg, err } switch msg.Type { case TypeGeneralMessage: - return msg, fmt.Errorf("only msg.type=%d (TypeGeneralMessageWithToken) is supported", - TypeGeneralMessageWithToken) + return msg, fmt.Errorf("msg.type=%d (TypeGeneralMessage) is not supported. Supported types include: %d", + TypeGeneralMessage, TypeGeneralMessageWithToken) case TypeGeneralMessageWithToken: return msg, nil default: diff --git a/x/uibc/gmp/gmp_middleware_test.go b/x/uibc/gmp/gmp_middleware_test.go index b2429ade21..8101c750ad 100644 --- a/x/uibc/gmp/gmp_middleware_test.go +++ b/x/uibc/gmp/gmp_middleware_test.go @@ -36,7 +36,7 @@ func TestGmpMemoHandler(t *testing.T) { { name: "unsupport msg", memo: func() string { - validMemo := GMPMemo{ + validMemo := Memo{ SourceChain: "source_chain", SourceAddress: "source_addr", Payload: nil, @@ -51,7 +51,7 @@ func TestGmpMemoHandler(t *testing.T) { { name: "unsupport msg", memo: func() string { - validMemo := GMPMemo{ + validMemo := Memo{ SourceChain: "source_chain", SourceAddress: "source_addr", Payload: nil, @@ -61,12 +61,12 @@ func TestGmpMemoHandler(t *testing.T) { assert.NilError(t, err) return string(m) }, - errMsg: "only msg.type=2 (TypeGeneralMessageWithToken) is supported", + errMsg: "msg.type=1 (TypeGeneralMessage) is not supported. Supported types include: 2", }, { name: "valid memo", memo: func() string { - validMemo := GMPMemo{ + validMemo := Memo{ SourceChain: "source_chain", SourceAddress: "source_addr", Payload: nil, diff --git a/x/uibc/gmp/types.go b/x/uibc/gmp/types.go index 4da7eb77b9..65e20a2361 100644 --- a/x/uibc/gmp/types.go +++ b/x/uibc/gmp/types.go @@ -15,8 +15,8 @@ const ( TypeSendToken ) -// GMPMemo is attached in ICS20 packet memo field -type GMPMemo 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"`