Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 29 additions & 8 deletions tests/integration/x/ibc/callbacks/test_keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,37 +27,54 @@ func (s *KeeperTestSuite) TestOnRecvPacket() {
)
testCases := []struct {
name string
malleate func()
malleate func() uint64
expErr error
}{
{
"packet data is transfer with receiver account already existing",
func() uint64 {
receiverAcc, err := sdk.AccAddressFromBech32(receiver)
s.Require().NoError(err)

// Create and set the account
acc := s.network.App.GetAccountKeeper().NewAccountWithAddress(ctx, receiverAcc)
s.network.App.GetAccountKeeper().SetAccount(ctx, acc)
s.Require().True(s.network.App.GetAccountKeeper().HasAccount(ctx, receiverAcc))
return acc.GetAccountNumber()
},
types.ErrContractHasNoCode,
},
{
"contract code does not exist",
func() {},
func() uint64 { return 0 },
types.ErrContractHasNoCode,
},
{
"packet data is not transfer",
func() {
func() uint64 {
packet.Data = []byte("not a transfer packet")
return 0
},
ibcerrors.ErrInvalidType,
ibcerrors.ErrInvalidType, // This will be wrapped by the transfer module
},
{
"packet data is transfer but receiver is not isolated address",
func() {
func() uint64 {
receiver = senderKey.AccAddr.String() // not an isolated address
transferData.Receiver = receiver
transferDataBz := transferData.GetBytes()
packet.Data = transferDataBz
return 0
},
types.ErrInvalidReceiverAddress,
},
{
"packet data is transfer but callback data is not valid",
func() {
func() uint64 {
transferData.Memo = fmt.Sprintf(`{"dest_callback": {"address": 10, "calldata": "%x"}}`, []byte("calldata"))
transferDataBz := transferData.GetBytes()
packet.Data = transferDataBz
return 0
},
cbtypes.ErrInvalidCallbackData,
},
Expand Down Expand Up @@ -93,9 +110,13 @@ func (s *KeeperTestSuite) TestOnRecvPacket() {
)
ack := channeltypes.NewResultAcknowledgement([]byte{1})

tc.malleate()

originalAccNumber := tc.malleate()
err := s.network.App.GetCallbackKeeper().IBCReceivePacketCallback(ctx, packet, ack, contract.Hex(), transfertypes.V1)
if originalAccNumber != 0 {
acc := s.network.App.GetAccountKeeper().GetAccount(ctx, sdk.MustAccAddressFromBech32(receiver))
s.Require().NotNil(acc)
s.Require().Equal(originalAccNumber, acc.GetAccountNumber(), "account number should not be modified")
}
if tc.expErr != nil {
s.Require().Contains(err.Error(), tc.expErr.Error(), "expected error: %s, got: %s", tc.expErr.Error(), err.Error())
} else {
Expand Down
6 changes: 4 additions & 2 deletions x/ibc/callbacks/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,10 @@ func (k ContractKeeper) IBCReceivePacketCallback(
isolatedAddr := types.GenerateIsolatedAddress(packet.GetDestChannel(), data.Sender)
isolatedAddrHex := common.BytesToAddress(isolatedAddr.Bytes())

acc := k.authKeeper.NewAccountWithAddress(ctx, receiver)
k.authKeeper.SetAccount(ctx, acc)
if !k.authKeeper.HasAccount(ctx, receiver) {
acc := k.authKeeper.NewAccountWithAddress(ctx, receiver)
k.authKeeper.SetAccount(ctx, acc)
}

// Ensure receiver address is equal to the isolated address.
if receiverHex.Cmp(isolatedAddrHex) != 0 {
Expand Down
1 change: 1 addition & 0 deletions x/ibc/callbacks/types/expected_keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
type AccountKeeper interface {
NewAccountWithAddress(ctx context.Context, addr sdk.AccAddress) sdk.AccountI
SetAccount(ctx context.Context, acc sdk.AccountI)
HasAccount(ctx context.Context, addr sdk.AccAddress) bool
}

// EVMKeeper defines the expected EVM keeper interface used on erc20
Expand Down