From cb204df0ea122da955c285de012979f7e80c6704 Mon Sep 17 00:00:00 2001 From: Cian Hatton Date: Wed, 10 Aug 2022 15:23:06 +0100 Subject: [PATCH 1/6] feat(test): adding test to verify invalid recipient address over incentivized channel --- e2e/fee_middleware_test.go | 113 +++++++++++++++++++++++++++++++++++++ e2e/testvalues/values.go | 5 +- 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/e2e/fee_middleware_test.go b/e2e/fee_middleware_test.go index 3906b88bbc8..beca7f699d6 100644 --- a/e2e/fee_middleware_test.go +++ b/e2e/fee_middleware_test.go @@ -197,6 +197,119 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_AsyncSingleSender_Succeeds( }) } +func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { + ctx := context.TODO() + + relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions()) + chainA, chainB := s.GetChains() + + var ( + chainADenom = chainA.Config().Denom + testFee = testvalues.DefaultFee(chainADenom) + payPacketFeeTxResp sdk.TxResponse + ) + + chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount) + + s.Run("relayer wallets recovered", func() { + err := s.RecoverRelayerWallets(ctx, relayer) + s.Require().NoError(err) + }) + + chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer) + s.Run("relayer wallets fetched", func() { + s.Require().NoError(err) + }) + + s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks") + + _, chainBRelayerUser := s.GetRelayerUsers(ctx) + + s.Run("register counter party payee", func() { + resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.Address, chainARelayerWallet.Address) + s.Require().NoError(err) + s.AssertValidTxResponse(resp) + }) + + s.Run("verify counter party payee", func() { + address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.Address, channelA.Counterparty.ChannelID) + s.Require().NoError(err) + s.Require().Equal(chainARelayerWallet.Address, address) + }) + + transferAmount := testvalues.DefaultTransferAmount(chainADenom) + + s.Run("send IBC transfer", func() { + transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), testvalues.InvalidAddress, clienttypes.NewHeight(1, 1000), 0) + txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, transferMsg) + // this message should be successful, as receiver account is not validated on the sending chain. + s.Require().NoError(err) + s.AssertValidTxResponse(txResp) + }) + + s.Run("tokens are escrowed", func() { + actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) + s.Require().NoError(err) + + expected := testvalues.StartingTokenAmount - transferAmount.Amount.Int64() + s.Require().Equal(expected, actualBalance) + }) + + s.Run("pay packet fee", func() { + s.Run("no incentivized packets", func() { + packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID) + s.Require().NoError(err) + s.Require().Empty(packets) + }) + + packetId := channeltypes.NewPacketID(channelA.PortID, channelA.ChannelID, 1) + packetFee := feetypes.NewPacketFee(testFee, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), nil) + + s.Run("should succeed", func() { + payPacketFeeTxResp, err = s.PayPacketFeeAsync(ctx, chainA, chainAWallet, packetId, packetFee) + s.Require().NoError(err) + s.AssertValidTxResponse(payPacketFeeTxResp) + }) + + s.Run("there should be incentivized packets", func() { + packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID) + s.Require().NoError(err) + s.Require().Len(packets, 1) + actualFee := packets[0].PacketFees[0].Fee + + s.Require().True(actualFee.RecvFee.IsEqual(testFee.RecvFee)) + s.Require().True(actualFee.AckFee.IsEqual(testFee.AckFee)) + s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee)) + }) + + s.Run("balance should be lowered by sum of recv ack and timeout", func() { + // The balance should be lowered by the sum of the recv, ack and timeout fees. + actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) + s.Require().NoError(err) + + expected := testvalues.StartingTokenAmount - transferAmount.Amount.Int64() - testFee.Total().AmountOf(chainADenom).Int64() + s.Require().Equal(expected, actualBalance) + }) + }) + + s.Run("start relayer", func() { + s.StartRelayer(relayer) + }) + + s.Run("packets are relayed", func() { + packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID) + s.Require().NoError(err) + s.Require().Empty(packets) + }) + s.Run("timeout fee and transfer amount refunded", func() { + actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) + s.Require().NoError(err) + + expected := testvalues.StartingTokenAmount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64() + s.Require().Equal(expected, actualBalance, "the amount sent and timeout fee should have been refunded as there was an invalid receiver address provided") + }) +} + func (s *FeeMiddlewareTestSuite) TestMultiMsg_MsgPayPacketFeeSingleSender() { t := s.T() ctx := context.TODO() diff --git a/e2e/testvalues/values.go b/e2e/testvalues/values.go index e281429a9ec..964111e7af1 100644 --- a/e2e/testvalues/values.go +++ b/e2e/testvalues/values.go @@ -8,8 +8,9 @@ import ( ) const ( - StartingTokenAmount int64 = 10_000_000 - IBCTransferAmount int64 = 10_000 + StartingTokenAmount int64 = 10_000_000 + IBCTransferAmount int64 = 10_000 + InvalidAddress string = "" ) // ImmediatelyTimeout returns an ibc.IBCTimeout which will cause an IBC transfer to timeout immediately. From af229e7d1359286ab667552996f83901afb33c83 Mon Sep 17 00:00:00 2001 From: Cian Hatton Date: Wed, 10 Aug 2022 15:47:06 +0100 Subject: [PATCH 2/6] feat(test): adding TestMsgPayPacketFee_InvalidAccount --- e2e/fee_middleware_test.go | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/e2e/fee_middleware_test.go b/e2e/fee_middleware_test.go index beca7f699d6..20f4f26478f 100644 --- a/e2e/fee_middleware_test.go +++ b/e2e/fee_middleware_test.go @@ -197,7 +197,8 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_AsyncSingleSender_Succeeds( }) } -func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { +func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidAccount() { + t := s.T() ctx := context.TODO() relayer, channelA := s.SetupChainsRelayerAndChannel(ctx, feeMiddlewareChannelOptions()) @@ -211,13 +212,13 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount) - s.Run("relayer wallets recovered", func() { + t.Run("relayer wallets recovered", func(t *testing.T) { err := s.RecoverRelayerWallets(ctx, relayer) s.Require().NoError(err) }) chainARelayerWallet, chainBRelayerWallet, err := s.GetRelayerWallets(relayer) - s.Run("relayer wallets fetched", func() { + t.Run("relayer wallets fetched", func(t *testing.T) { s.Require().NoError(err) }) @@ -225,13 +226,13 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { _, chainBRelayerUser := s.GetRelayerUsers(ctx) - s.Run("register counter party payee", func() { + t.Run("register counter party payee", func(t *testing.T) { resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.Address, chainARelayerWallet.Address) s.Require().NoError(err) s.AssertValidTxResponse(resp) }) - s.Run("verify counter party payee", func() { + t.Run("verify counter party payee", func(t *testing.T) { address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.Address, channelA.Counterparty.ChannelID) s.Require().NoError(err) s.Require().Equal(chainARelayerWallet.Address, address) @@ -239,7 +240,7 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { transferAmount := testvalues.DefaultTransferAmount(chainADenom) - s.Run("send IBC transfer", func() { + t.Run("send IBC transfer", func(t *testing.T) { transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), testvalues.InvalidAddress, clienttypes.NewHeight(1, 1000), 0) txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, transferMsg) // this message should be successful, as receiver account is not validated on the sending chain. @@ -247,7 +248,7 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { s.AssertValidTxResponse(txResp) }) - s.Run("tokens are escrowed", func() { + t.Run("tokens are escrowed", func(t *testing.T) { actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) s.Require().NoError(err) @@ -255,8 +256,8 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { s.Require().Equal(expected, actualBalance) }) - s.Run("pay packet fee", func() { - s.Run("no incentivized packets", func() { + t.Run("pay packet fee", func(t *testing.T) { + t.Run("no incentivized packets", func(t *testing.T) { packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID) s.Require().NoError(err) s.Require().Empty(packets) @@ -265,13 +266,13 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { packetId := channeltypes.NewPacketID(channelA.PortID, channelA.ChannelID, 1) packetFee := feetypes.NewPacketFee(testFee, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), nil) - s.Run("should succeed", func() { + t.Run("should succeed", func(t *testing.T) { payPacketFeeTxResp, err = s.PayPacketFeeAsync(ctx, chainA, chainAWallet, packetId, packetFee) s.Require().NoError(err) s.AssertValidTxResponse(payPacketFeeTxResp) }) - s.Run("there should be incentivized packets", func() { + t.Run("there should be incentivized packets", func(t *testing.T) { packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID) s.Require().NoError(err) s.Require().Len(packets, 1) @@ -282,7 +283,7 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee)) }) - s.Run("balance should be lowered by sum of recv ack and timeout", func() { + t.Run("balance should be lowered by sum of recv ack and timeout", func(t *testing.T) { // The balance should be lowered by the sum of the recv, ack and timeout fees. actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) s.Require().NoError(err) @@ -292,19 +293,21 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { }) }) - s.Run("start relayer", func() { + t.Run("start relayer", func(t *testing.T) { s.StartRelayer(relayer) }) - s.Run("packets are relayed", func() { + t.Run("packets are relayed", func(t *testing.T) { packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID) s.Require().NoError(err) s.Require().Empty(packets) }) - s.Run("timeout fee and transfer amount refunded", func() { + t.Run("timeout fee and transfer amount refunded", func(t *testing.T) { actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) s.Require().NoError(err) + // once the relayer has relayed the packets, the timeout fee should be refunded. + // the address was invalid so the amount sent should be unescrowed. expected := testvalues.StartingTokenAmount - testFee.AckFee.AmountOf(chainADenom).Int64() - testFee.RecvFee.AmountOf(chainADenom).Int64() s.Require().Equal(expected, actualBalance, "the amount sent and timeout fee should have been refunded as there was an invalid receiver address provided") }) From 05d26c877c3b63301abd2b6fd11bedcb81c32844 Mon Sep 17 00:00:00 2001 From: Cian Hatton Date: Wed, 10 Aug 2022 15:50:38 +0100 Subject: [PATCH 3/6] chore: renaming test method to be more descriptive --- e2e/fee_middleware_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/fee_middleware_test.go b/e2e/fee_middleware_test.go index 20f4f26478f..e55f9c72537 100644 --- a/e2e/fee_middleware_test.go +++ b/e2e/fee_middleware_test.go @@ -197,7 +197,7 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_AsyncSingleSender_Succeeds( }) } -func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidAccount() { +func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { t := s.T() ctx := context.TODO() From e3bfb69aac602d3d5e222efc699330e10e32b05c Mon Sep 17 00:00:00 2001 From: Cian Hatton Date: Thu, 11 Aug 2022 16:10:23 +0100 Subject: [PATCH 4/6] chore: using new helper method --- e2e/fee_middleware_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/fee_middleware_test.go b/e2e/fee_middleware_test.go index 10c4336d643..8e36d8b66b2 100644 --- a/e2e/fee_middleware_test.go +++ b/e2e/fee_middleware_test.go @@ -240,7 +240,7 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { transferAmount := testvalues.DefaultTransferAmount(chainADenom) t.Run("send IBC transfer", func(t *testing.T) { - transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), testvalues.InvalidAddress, clienttypes.NewHeight(1, 1000), 0) + transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), testvalues.InvalidAddress, s.GetTimeoutHeight(ctx, chainA), 0) txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, transferMsg) // this message should be successful, as receiver account is not validated on the sending chain. s.Require().NoError(err) From 76dc4bc1f4bf1fea188083f23c71f0f5aad1061f Mon Sep 17 00:00:00 2001 From: Cian Hatton Date: Fri, 12 Aug 2022 09:28:41 +0100 Subject: [PATCH 5/6] chore: addressing PR feedback --- e2e/fee_middleware_test.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/e2e/fee_middleware_test.go b/e2e/fee_middleware_test.go index 8e36d8b66b2..7fff1a60f9b 100644 --- a/e2e/fee_middleware_test.go +++ b/e2e/fee_middleware_test.go @@ -107,13 +107,13 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_AsyncSingleSender_Succeeds( _, chainBRelayerUser := s.GetRelayerUsers(ctx) - t.Run("register counter party payee", func(t *testing.T) { + t.Run("register counterparty payee", func(t *testing.T) { resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.Address, chainARelayerWallet.Address) s.Require().NoError(err) s.AssertValidTxResponse(resp) }) - t.Run("verify counter party payee", func(t *testing.T) { + t.Run("verify counterparty payee", func(t *testing.T) { address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.Address, channelA.Counterparty.ChannelID) s.Require().NoError(err) s.Require().Equal(chainARelayerWallet.Address, address) @@ -225,13 +225,13 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { _, chainBRelayerUser := s.GetRelayerUsers(ctx) - t.Run("register counter party payee", func(t *testing.T) { + t.Run("register counterparty payee", func(t *testing.T) { resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.Address, chainARelayerWallet.Address) s.Require().NoError(err) s.AssertValidTxResponse(resp) }) - t.Run("verify counter party payee", func(t *testing.T) { + t.Run("verify counterparty payee", func(t *testing.T) { address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.Address, channelA.Counterparty.ChannelID) s.Require().NoError(err) s.Require().Equal(chainARelayerWallet.Address, address) @@ -240,7 +240,7 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { transferAmount := testvalues.DefaultTransferAmount(chainADenom) t.Run("send IBC transfer", func(t *testing.T) { - transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), testvalues.InvalidAddress, s.GetTimeoutHeight(ctx, chainA), 0) + transferMsg := transfertypes.NewMsgTransfer(channelA.PortID, channelA.ChannelID, transferAmount, chainAWallet.Bech32Address(chainA.Config().Bech32Prefix), testvalues.InvalidAddress, s.GetTimeoutHeight(ctx, chainB), 0) txResp, err := s.BroadcastMessages(ctx, chainA, chainAWallet, transferMsg) // this message should be successful, as receiver account is not validated on the sending chain. s.Require().NoError(err) @@ -349,13 +349,13 @@ func (s *FeeMiddlewareTestSuite) TestMultiMsg_MsgPayPacketFeeSingleSender() { s.Require().NoError(err) t.Logf("relayer A user starting with balance: %d", relayerAStartingBalance) - t.Run("register counter party payee", func(t *testing.T) { + t.Run("register counterparty payee", func(t *testing.T) { multiMsgTxResponse, err = s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.Address, chainARelayerWallet.Address) s.Require().NoError(err) s.AssertValidTxResponse(multiMsgTxResponse) }) - t.Run("verify counter party payee", func(t *testing.T) { + t.Run("verify counterparty payee", func(t *testing.T) { address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.Address, channelA.Counterparty.ChannelID) s.Require().NoError(err) s.Require().Equal(chainARelayerWallet.Address, address) @@ -451,13 +451,13 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_SingleSender_TimesOut() { _, chainBRelayerUser := s.GetRelayerUsers(ctx) - t.Run("register counter party payee", func(t *testing.T) { + t.Run("register counterparty payee", func(t *testing.T) { resp, err := s.RegisterCounterPartyPayee(ctx, chainB, chainBRelayerUser, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, chainBRelayerWallet.Address, chainARelayerWallet.Address) s.Require().NoError(err) s.AssertValidTxResponse(resp) }) - t.Run("verify counter party payee", func(t *testing.T) { + t.Run("verify counterparty payee", func(t *testing.T) { address, err := s.QueryCounterPartyPayee(ctx, chainB, chainBRelayerWallet.Address, channelA.Counterparty.ChannelID) s.Require().NoError(err) s.Require().Equal(chainARelayerWallet.Address, address) @@ -624,7 +624,7 @@ func (s *FeeMiddlewareTestSuite) TestPayPacketFeeAsync_SingleSender_NoCounterPar s.StartRelayer(relayer) }) - t.Run("with no counter party address", func(t *testing.T) { + t.Run("with no counterparty address", func(t *testing.T) { t.Run("packets are relayed", func(t *testing.T) { packets, err := s.QueryIncentivizedPacketsForChannel(ctx, chainA, channelA.PortID, channelA.ChannelID) s.Require().NoError(err) From 857acdf18a66bc72679558450ee4fbf833227b5c Mon Sep 17 00:00:00 2001 From: Cian Hatton Date: Fri, 12 Aug 2022 12:26:26 +0100 Subject: [PATCH 6/6] Update e2e/fee_middleware_test.go Co-authored-by: Carlos Rodriguez --- e2e/fee_middleware_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/fee_middleware_test.go b/e2e/fee_middleware_test.go index 7fff1a60f9b..260209c7978 100644 --- a/e2e/fee_middleware_test.go +++ b/e2e/fee_middleware_test.go @@ -282,7 +282,7 @@ func (s *FeeMiddlewareTestSuite) TestMsgPayPacketFee_InvalidReceiverAccount() { s.Require().True(actualFee.TimeoutFee.IsEqual(testFee.TimeoutFee)) }) - t.Run("balance should be lowered by sum of recv ack and timeout", func(t *testing.T) { + t.Run("balance should be lowered by sum of recv, ack and timeout", func(t *testing.T) { // The balance should be lowered by the sum of the recv, ack and timeout fees. actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) s.Require().NoError(err)