Skip to content

Commit ba7c4a8

Browse files
feat(transfer): add validation for forwarding info in msg transfer validate basic (#6583)
1 parent ae2046a commit ba7c4a8

File tree

2 files changed

+52
-36
lines changed

2 files changed

+52
-36
lines changed

modules/apps/transfer/types/msgs.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,17 @@ func (msg MsgTransfer) ValidateBasic() error {
102102
return errorsmod.Wrapf(ErrInvalidMemo, "memo must not exceed %d bytes", MaximumMemoLength)
103103
}
104104

105+
if msg.ForwardingPath != nil {
106+
if err := msg.ForwardingPath.Validate(); err != nil {
107+
return err
108+
}
109+
110+
// We cannot have non-empty memo and non-empty forwarding path hops at the same time.
111+
if len(msg.ForwardingPath.Hops) > 0 && msg.Memo != "" {
112+
return errorsmod.Wrapf(ErrInvalidMemo, "memo must be empty if forwarding path hops is not empty: %s, %s", msg.Memo, msg.ForwardingPath.Hops)
113+
}
114+
}
115+
105116
for _, coin := range msg.GetCoins() {
106117
if err := validateIBCCoin(coin); err != nil {
107118
return errorsmod.Wrapf(ibcerrors.ErrInvalidCoins, "%s: %s", err.Error(), coin.String())

modules/apps/transfer/types/msgs_test.go

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,24 @@ func TestMsgTransferValidation(t *testing.T) {
7979
{"multidenom: zero coins", types.NewMsgTransfer(validPort, validChannel, zeroCoins, sender, receiver, timeoutHeight, 0, "", nil), ibcerrors.ErrInvalidCoins},
8080
{"multidenom: too many coins", types.NewMsgTransfer(validPort, validChannel, make([]sdk.Coin, types.MaximumTokensLength+1), sender, receiver, timeoutHeight, 0, "", nil), ibcerrors.ErrInvalidCoins},
8181
{"multidenom: both token and tokens are set", &types.MsgTransfer{validPort, validChannel, coin, sender, receiver, timeoutHeight, 0, "", coins, nil}, ibcerrors.ErrInvalidCoins},
82+
{"memo must be empty if forwarding path hops is not empty", types.NewMsgTransfer(validPort, validChannel, coins, sender, receiver, timeoutHeight, 0, "memo", types.NewForwardingInfo("", validHop)), types.ErrInvalidMemo},
83+
{"invalid forwarding info port", types.NewMsgTransfer(validPort, validChannel, coins, sender, receiver, timeoutHeight, 0, "", types.NewForwardingInfo("", types.Hop{PortId: invalidPort, ChannelId: validChannel})), host.ErrInvalidID},
84+
{"invalid forwarding info channel", types.NewMsgTransfer(validPort, validChannel, coins, sender, receiver, timeoutHeight, 0, "", types.NewForwardingInfo("", types.Hop{PortId: validPort, ChannelId: invalidChannel})), host.ErrInvalidID},
85+
{"invalid forwarding info too many hops", types.NewMsgTransfer(validPort, validChannel, coins, sender, receiver, timeoutHeight, 0, "", types.NewForwardingInfo("", generateHops(types.MaximumNumberOfForwardingHops+1)...)), types.ErrInvalidForwardingInfo},
86+
{"invalid forwarding info too long memo", types.NewMsgTransfer(validPort, validChannel, coins, sender, receiver, timeoutHeight, 0, "", types.NewForwardingInfo(ibctesting.GenerateString(types.MaximumMemoLength+1), validHop)), types.ErrInvalidMemo},
8287
}
8388

8489
for _, tc := range testCases {
85-
tc := tc
86-
87-
err := tc.msg.ValidateBasic()
88-
89-
expPass := tc.expError == nil
90-
if expPass {
91-
require.NoError(t, err)
92-
} else {
93-
require.ErrorIs(t, err, tc.expError)
94-
}
90+
t.Run(tc.name, func(t *testing.T) {
91+
err := tc.msg.ValidateBasic()
92+
93+
expPass := tc.expError == nil
94+
if expPass {
95+
require.NoError(t, err)
96+
} else {
97+
require.ErrorIs(t, err, tc.expError)
98+
}
99+
})
95100
}
96101
}
97102

@@ -119,16 +124,16 @@ func TestMsgUpdateParamsValidateBasic(t *testing.T) {
119124
}
120125

121126
for _, tc := range testCases {
122-
tc := tc
123-
124-
err := tc.msg.ValidateBasic()
125-
126-
expPass := tc.expError == nil
127-
if expPass {
128-
require.NoError(t, err)
129-
} else {
130-
require.ErrorIs(t, err, tc.expError)
131-
}
127+
t.Run(tc.name, func(t *testing.T) {
128+
err := tc.msg.ValidateBasic()
129+
130+
expPass := tc.expError == nil
131+
if expPass {
132+
require.NoError(t, err)
133+
} else {
134+
require.ErrorIs(t, err, tc.expError)
135+
}
136+
})
132137
}
133138
}
134139

@@ -144,21 +149,21 @@ func TestMsgUpdateParamsGetSigners(t *testing.T) {
144149
}
145150

146151
for _, tc := range testCases {
147-
tc := tc
148-
149-
msg := types.MsgUpdateParams{
150-
Signer: tc.address.String(),
151-
Params: types.DefaultParams(),
152-
}
153-
154-
encodingCfg := moduletestutil.MakeTestEncodingConfig(transfer.AppModuleBasic{})
155-
signers, _, err := encodingCfg.Codec.GetMsgV1Signers(&msg)
156-
157-
if tc.expPass {
158-
require.NoError(t, err)
159-
require.Equal(t, tc.address.Bytes(), signers[0])
160-
} else {
161-
require.Error(t, err)
162-
}
152+
t.Run(tc.name, func(t *testing.T) {
153+
msg := types.MsgUpdateParams{
154+
Signer: tc.address.String(),
155+
Params: types.DefaultParams(),
156+
}
157+
158+
encodingCfg := moduletestutil.MakeTestEncodingConfig(transfer.AppModuleBasic{})
159+
signers, _, err := encodingCfg.Codec.GetMsgV1Signers(&msg)
160+
161+
if tc.expPass {
162+
require.NoError(t, err)
163+
require.Equal(t, tc.address.Bytes(), signers[0])
164+
} else {
165+
require.Error(t, err)
166+
}
167+
})
163168
}
164169
}

0 commit comments

Comments
 (0)