diff --git a/x/warp/keeper/logic_collateral.go b/x/warp/keeper/logic_collateral.go index 47531de1..409f10ea 100644 --- a/x/warp/keeper/logic_collateral.go +++ b/x/warp/keeper/logic_collateral.go @@ -88,7 +88,7 @@ func (k *Keeper) RemoteTransferCollateral(ctx sdk.Context, token types.HypToken, // RemoteReceiveCollateral handles the receipt of collateral from a remote chain. // It updates the token balance, verifies there is enough collateral, and transfers the funds to the recipient's account. func (k *Keeper) RemoteReceiveCollateral(ctx context.Context, token types.HypToken, payload types.WarpPayload) error { - account := sdk.AccAddress(payload.Recipient()[12:32]) + account := payload.GetCosmosAccount() amount := math.NewIntFromBigInt(payload.Amount()) diff --git a/x/warp/keeper/logic_collateral_test.go b/x/warp/keeper/logic_collateral_test.go index 14aaf9cf..2ee9f051 100644 --- a/x/warp/keeper/logic_collateral_test.go +++ b/x/warp/keeper/logic_collateral_test.go @@ -11,6 +11,7 @@ import ( coreTypes "github.com/bcp-innovations/hyperlane-cosmos/x/core/types" "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -29,6 +30,7 @@ TEST CASES - logic_collateral.go * MsgRemoteTransfer (invalid) insufficient funds (Collateral) * MsgRemoteTransfer & MsgRemoteReceiveCollateral (invalid) not enough collateral (Collateral) * MsgRemoteTransfer && MsgRemoteReceiveCollateral (valid) (Collateral) +* MsgRemoteTransfer && MsgRemoteReceiveCollateral (valid) 32-byte address (Collateral) */ @@ -366,4 +368,67 @@ var _ = Describe("logic_collateral.go", Ordered, func() { Expect(err).To(BeNil()) Expect(s.App().BankKeeper.GetBalance(s.Ctx(), sender.AccAddress, denom).Amount).To(Equal(senderBalance.Amount.Add(amount))) }) + + It("MsgRemoteTransfer && MsgRemoteReceiveCollateral (valid) 32-byte address (Collateral)", func() { + // Arrange + receiverAddress, _ := util.DecodeHexAddress("0xd7194459d45619d04a5a0f9e78dc9594a0f37fd6da8382fe12ddda6f2f46d647") + remoteRouter := types.RemoteRouter{ + ReceiverDomain: 1, + ReceiverContract: "0x934b867052ca9c65e33362112f35fb548f8732c2fe45f07b9c591958e865def0", + Gas: math.NewInt(50000), + } + + amount := math.NewInt(100) + maxFee := sdk.NewCoin(denom, math.NewInt(250000)) + + tokenId, mailboxId, igpId, _ := createToken(s, &remoteRouter, owner.Address, sender.Address, types.HYP_TOKEN_TYPE_COLLATERAL) + err := s.MintBaseCoins(sender.Address, 1_000_000) + Expect(err).To(BeNil()) + + // Act + _, err = s.RunTx(&types.MsgRemoteTransfer{ + Sender: sender.Address, + TokenId: tokenId, + DestinationDomain: remoteRouter.ReceiverDomain, + Recipient: receiverAddress, + Amount: amount, + CustomHookId: &igpId, + GasLimit: math.ZeroInt(), + MaxFee: maxFee, + }) + Expect(err).To(BeNil()) + + receiverContract, err := util.DecodeHexAddress(remoteRouter.ReceiverContract) + Expect(err).To(BeNil()) + + warpRecipient := address.Module(types.ModuleName, []byte("collateral-receiver")) + Expect(len(warpRecipient)).To(Equal(address.Len)) + + warpPayload, err := types.NewWarpPayload(warpRecipient, *big.NewInt(amount.Int64())) + Expect(err).To(BeNil()) + + message := util.HyperlaneMessage{ + Version: 3, + Nonce: 1, + Origin: remoteRouter.ReceiverDomain, + Sender: receiverContract, + Destination: 0, + Recipient: tokenId, + Body: warpPayload.Bytes(), + } + + receiverAcc := sdk.AccAddress(warpRecipient) + receiverBalance := s.App().BankKeeper.GetBalance(s.Ctx(), receiverAcc, denom) + + _, err = s.RunTx(&coreTypes.MsgProcessMessage{ + MailboxId: mailboxId, + Relayer: sender.Address, + Metadata: "", + Message: message.String(), + }) + + // Assert + Expect(err).To(BeNil()) + Expect(s.App().BankKeeper.GetBalance(s.Ctx(), receiverAcc, denom).Amount).To(Equal(receiverBalance.Amount.Add(amount))) + }) })