Skip to content

Commit 3d667ca

Browse files
authored
Merge commit from fork
* add fix and test remove packet data check add check to unmarshal function for packet data lint rm test case patch fix to v10 * fix merge
1 parent 97ab265 commit 3d667ca

File tree

3 files changed

+133
-1
lines changed

3 files changed

+133
-1
lines changed

modules/apps/transfer/ibc_module.go

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package transfer
22

33
import (
4+
"bytes"
45
"fmt"
56
"math"
67
"slices"
@@ -231,6 +232,11 @@ func (im IBCModule) OnAcknowledgementPacket(
231232
return err
232233
}
233234

235+
bz := types.ModuleCdc.MustMarshalJSON(&ack)
236+
if !bytes.Equal(bz, acknowledgement) {
237+
return errorsmod.Wrapf(ibcerrors.ErrInvalidType, "acknowledgement did not marshal to expected bytes: %X ≠ %X", bz, acknowledgement)
238+
}
239+
234240
if err := im.keeper.OnAcknowledgementPacket(ctx, packet.SourcePort, packet.SourceChannel, data, ack); err != nil {
235241
return err
236242
}

modules/apps/transfer/ibc_module_test.go

+118
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,124 @@ func (suite *TransferTestSuite) TestOnRecvPacket() {
348348
}
349349
}
350350

351+
func (suite *TransferTestSuite) TestOnAcknowledgePacket() {
352+
var (
353+
path *ibctesting.Path
354+
packet channeltypes.Packet
355+
ack []byte
356+
)
357+
358+
testCases := []struct {
359+
name string
360+
malleate func()
361+
expError error
362+
expRefund bool
363+
}{
364+
{
365+
"success",
366+
func() {},
367+
nil,
368+
false,
369+
},
370+
{
371+
"success: refund coins",
372+
func() {
373+
ack = channeltypes.NewErrorAcknowledgement(ibcerrors.ErrInsufficientFunds).Acknowledgement()
374+
},
375+
nil,
376+
true,
377+
},
378+
{
379+
"cannot refund ack on non-existent channel",
380+
func() {
381+
ack = channeltypes.NewErrorAcknowledgement(ibcerrors.ErrInsufficientFunds).Acknowledgement()
382+
383+
packet.SourceChannel = "channel-100"
384+
},
385+
errors.New("unable to unescrow tokens"),
386+
false,
387+
},
388+
{
389+
"invalid packet data",
390+
func() {
391+
packet.Data = []byte("invalid data")
392+
},
393+
ibcerrors.ErrInvalidType,
394+
false,
395+
},
396+
{
397+
"invalid acknowledgement",
398+
func() {
399+
ack = []byte("invalid ack")
400+
},
401+
ibcerrors.ErrUnknownRequest,
402+
false,
403+
},
404+
{
405+
"cannot refund already acknowledged packet",
406+
func() {
407+
ack = channeltypes.NewErrorAcknowledgement(ibcerrors.ErrInsufficientFunds).Acknowledgement()
408+
409+
cbs, ok := suite.chainA.App.GetIBCKeeper().PortKeeper.Route(ibctesting.TransferPort)
410+
suite.Require().True(ok)
411+
412+
suite.Require().NoError(cbs.OnAcknowledgementPacket(suite.chainA.GetContext(), path.EndpointA.GetChannel().Version, packet, ack, suite.chainA.SenderAccount.GetAddress()))
413+
},
414+
errors.New("unable to unescrow tokens"),
415+
false,
416+
},
417+
}
418+
419+
for _, tc := range testCases {
420+
tc := tc
421+
suite.Run(tc.name, func() {
422+
suite.SetupTest() // reset
423+
424+
path = ibctesting.NewTransferPath(suite.chainA, suite.chainB)
425+
path.Setup()
426+
427+
timeoutHeight := suite.chainA.GetTimeoutHeight()
428+
msg := types.NewMsgTransfer(
429+
path.EndpointA.ChannelConfig.PortID,
430+
path.EndpointA.ChannelID,
431+
ibctesting.TestCoin,
432+
suite.chainA.SenderAccount.GetAddress().String(),
433+
suite.chainB.SenderAccount.GetAddress().String(),
434+
timeoutHeight,
435+
0,
436+
"",
437+
)
438+
res, err := suite.chainA.SendMsgs(msg)
439+
suite.Require().NoError(err) // message committed
440+
441+
packet, err = ibctesting.ParsePacketFromEvents(res.Events)
442+
suite.Require().NoError(err)
443+
444+
cbs, ok := suite.chainA.App.GetIBCKeeper().PortKeeper.Route(ibctesting.TransferPort)
445+
suite.Require().True(ok)
446+
447+
ack = channeltypes.NewResultAcknowledgement([]byte{byte(1)}).Acknowledgement()
448+
449+
tc.malleate() // change fields in packet
450+
451+
err = cbs.OnAcknowledgementPacket(suite.chainA.GetContext(), path.EndpointA.GetChannel().Version, packet, ack, suite.chainA.SenderAccount.GetAddress())
452+
453+
if tc.expError == nil {
454+
suite.Require().NoError(err)
455+
456+
if tc.expRefund {
457+
escrowAddress := types.GetEscrowAddress(packet.GetSourcePort(), packet.GetSourceChannel())
458+
escrowBalanceAfter := suite.chainA.GetSimApp().BankKeeper.GetBalance(suite.chainA.GetContext(), escrowAddress, sdk.DefaultBondDenom)
459+
suite.Require().Equal(sdkmath.NewInt(0), escrowBalanceAfter.Amount)
460+
}
461+
} else {
462+
suite.Require().Error(err)
463+
suite.Require().Contains(err.Error(), tc.expError.Error())
464+
}
465+
})
466+
}
467+
}
468+
351469
func (suite *TransferTestSuite) TestOnTimeoutPacket() {
352470
var path *ibctesting.Path
353471
var packet channeltypes.Packet

modules/apps/transfer/types/packet.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package types
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"errors"
67
"strings"
@@ -252,7 +253,7 @@ func UnmarshalPacketData(bz []byte, ics20Version string, encoding string) (Inter
252253
return InternalTransferRepresentation{}, errorsmod.Wrapf(ibcerrors.ErrInvalidType, failedUnmarshalingErrorMsg, errorMsgVersion, err.Error())
253254
}
254255
default:
255-
return InternalTransferRepresentation{}, errorsmod.Wrapf(ibcerrors.ErrInvalidType, "invalid encoding provided, must be either empty or one of [%q, %q], got %s", EncodingJSON, EncodingProtobuf, encoding)
256+
return InternalTransferRepresentation{}, errorsmod.Wrapf(ibcerrors.ErrInvalidType, "invalid encoding provided, must be either empty or one of [%q, %q, %q], got %s", EncodingJSON, EncodingProtobuf, EncodingABI, encoding)
256257
}
257258

258259
// When the unmarshaling is done, we want to retrieve the underlying data type based on the value of ics20Version
@@ -263,6 +264,13 @@ func UnmarshalPacketData(bz []byte, ics20Version string, encoding string) (Inter
263264
// We should never get here, as we manually constructed the type at the beginning of the file
264265
return InternalTransferRepresentation{}, errorsmod.Wrapf(ibcerrors.ErrInvalidType, "cannot convert proto message into FungibleTokenPacketData")
265266
}
267+
bz2, err := MarshalPacketData(*datav1, ics20Version, encoding)
268+
if err != nil {
269+
return InternalTransferRepresentation{}, errorsmod.Wrapf(ibcerrors.ErrInvalidType, "cannot marshal transfer packet data: %s", err.Error())
270+
}
271+
if !bytes.Equal(bz, bz2) {
272+
return InternalTransferRepresentation{}, errorsmod.Wrapf(ibcerrors.ErrInvalidType, "marshaled bytes are not equal: got %X, expected %X", bz2, bz)
273+
}
266274
// The call to ValidateBasic for V1 is done inside PacketDataV1toV2.
267275
return PacketDataV1ToV2(*datav1)
268276
}

0 commit comments

Comments
 (0)