From fec02f861bd47bcfaa041ecb919185750d7cb2bb Mon Sep 17 00:00:00 2001 From: bznein Date: Thu, 18 Jul 2024 14:52:49 +0100 Subject: [PATCH 1/7] Create e2e test for failed forwarding. --- e2e/tests/transfer/forwarding_test.go | 73 +++++++++++++++++++++++++++ e2e/testsuite/testsuite.go | 19 +++---- 2 files changed, 80 insertions(+), 12 deletions(-) diff --git a/e2e/tests/transfer/forwarding_test.go b/e2e/tests/transfer/forwarding_test.go index f7a2c33c15f..69c9959a154 100644 --- a/e2e/tests/transfer/forwarding_test.go +++ b/e2e/tests/transfer/forwarding_test.go @@ -289,3 +289,76 @@ func (s *TransferForwardingTestSuite) TestChannelUpgradeForwarding_Succeeds() { s.Require().Equal(expected, actualBalance.Int64()) }) } + +func (s *TransferForwardingTestSuite) TestFailedForwarding() { + t := s.T() + ctx := context.TODO() + + testName := t.Name() + t.Parallel() + relayer := s.CreateDefaultPaths(testName) + chains := s.GetAllChains() + + chainA, chainB, chainC := chains[0], chains[1], chains[2] + + chainADenom := chainA.Config().Denom + + chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount) + chainAAddress := chainAWallet.FormattedAddress() + + chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount) + + chainCWallet := s.CreateUserOnChainC(ctx, testvalues.StartingTokenAmount) + + channelAtoB := s.GetChainAChannelForTest(testName) + channelBtoC := s.GetChannelsForTest(chainB, testName)[1] + + s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks") + + chainBstartingBalance, err := s.GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) + s.Require().NoError(err) + + chainCstartingBalance, err := s.GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) + s.Require().NoError(err) + + t.Run("native IBC token transfer from chainA to invalid address through B", func(t *testing.T) { + inFiveMinutes := time.Now().Add(5 * time.Minute).UnixNano() + forwarding := transfertypes.NewForwarding(false, transfertypes.NewHop(channelBtoC.PortID, channelBtoC.ChannelID)) + resp := s.Transfer(ctx, chainA, chainAWallet, channelAtoB.PortID, channelAtoB.ChannelID, testvalues.DefaultTransferCoins(chainADenom), chainAAddress, testvalues.InvalidAddress, clienttypes.ZeroHeight(), uint64(inFiveMinutes), "", forwarding) + s.AssertTxSuccess(resp) + }) + + t.Run("tokens are escrowed", func(t *testing.T) { + actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) + s.Require().NoError(err) + + expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount + s.Require().Equal(expected, actualBalance) + }) + + t.Run("start relayer", func(t *testing.T) { + s.StartRelayer(relayer, testName) + }) + + t.Run("packets are relayed", func(t *testing.T) { + s.AssertPacketRelayed(ctx, chainA, channelAtoB.PortID, channelAtoB.ChannelID, 1) + }) + + t.Run("token transfer amount unescrowed", func(t *testing.T) { + actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) + s.Require().NoError(err) + + expected := testvalues.StartingTokenAmount + s.Require().Equal(expected, actualBalance) + }) + + t.Run("chain B and C balance has not changed", func(t *testing.T) { + chainBBalance, err := s.GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) + s.Require().NoError(err) + s.Require().Equal(chainBstartingBalance, chainBBalance) + + chainCBalance, err := s.GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) + s.Require().NoError(err) + s.Require().Equal(chainCstartingBalance, chainCBalance) + }) +} diff --git a/e2e/testsuite/testsuite.go b/e2e/testsuite/testsuite.go index 090028687f9..a292069fdeb 100644 --- a/e2e/testsuite/testsuite.go +++ b/e2e/testsuite/testsuite.go @@ -564,25 +564,20 @@ func (s *E2ETestSuite) createWalletOnChainIndex(ctx context.Context, amount, cha // GetChainANativeBalance gets the balance of a given user on chain A. func (s *E2ETestSuite) GetChainANativeBalance(ctx context.Context, user ibc.Wallet) (int64, error) { chainA := s.GetAllChains()[0] - - balanceResp, err := query.GRPCQuery[banktypes.QueryBalanceResponse](ctx, chainA, &banktypes.QueryBalanceRequest{ - Address: user.FormattedAddress(), - Denom: chainA.Config().Denom, - }) - if err != nil { - return 0, err - } - - return balanceResp.Balance.Amount.Int64(), nil + return s.GetChainBalanceForDenom(ctx, chainA, chainA.Config().Denom, user) } // GetChainBNativeBalance gets the balance of a given user on chain B. func (s *E2ETestSuite) GetChainBNativeBalance(ctx context.Context, user ibc.Wallet) (int64, error) { chainB := s.GetAllChains()[1] + return s.GetChainBalanceForDenom(ctx, chainB, chainB.Config().Denom, user) +} - balanceResp, err := query.GRPCQuery[banktypes.QueryBalanceResponse](ctx, chainB, &banktypes.QueryBalanceRequest{ +// GetChainBalanceForDenom returns the balance for a given denom given a chain. +func (s *E2ETestSuite) GetChainBalanceForDenom(ctx context.Context, chain ibc.Chain, denom string, user ibc.Wallet) (int64, error) { + balanceResp, err := query.GRPCQuery[banktypes.QueryBalanceResponse](ctx, chain, &banktypes.QueryBalanceRequest{ Address: user.FormattedAddress(), - Denom: chainB.Config().Denom, + Denom: denom, }) if err != nil { return 0, err From dfee13888bc818802f1dbe493793fd0de09a868b Mon Sep 17 00:00:00 2001 From: bznein Date: Thu, 18 Jul 2024 14:54:39 +0100 Subject: [PATCH 2/7] Added comment. --- e2e/tests/transfer/forwarding_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/e2e/tests/transfer/forwarding_test.go b/e2e/tests/transfer/forwarding_test.go index 69c9959a154..7599dfc0019 100644 --- a/e2e/tests/transfer/forwarding_test.go +++ b/e2e/tests/transfer/forwarding_test.go @@ -290,6 +290,8 @@ func (s *TransferForwardingTestSuite) TestChannelUpgradeForwarding_Succeeds() { }) } +// TestFailedForwarding tests the scenario in which the packet is sent from +// A to C (through B) but it can't reach C (we use an invalid address). func (s *TransferForwardingTestSuite) TestFailedForwarding() { t := s.T() ctx := context.TODO() From e9048cb6ec2358bf8d828a1f8297ce1e7d539bcb Mon Sep 17 00:00:00 2001 From: bznein Date: Thu, 18 Jul 2024 14:55:27 +0100 Subject: [PATCH 3/7] Fixed string --- e2e/tests/transfer/forwarding_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/tests/transfer/forwarding_test.go b/e2e/tests/transfer/forwarding_test.go index 7599dfc0019..cc6096212c4 100644 --- a/e2e/tests/transfer/forwarding_test.go +++ b/e2e/tests/transfer/forwarding_test.go @@ -354,7 +354,7 @@ func (s *TransferForwardingTestSuite) TestFailedForwarding() { s.Require().Equal(expected, actualBalance) }) - t.Run("chain B and C balance has not changed", func(t *testing.T) { + t.Run("balances for B and C have not changed", func(t *testing.T) { chainBBalance, err := s.GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) s.Require().NoError(err) s.Require().Equal(chainBstartingBalance, chainBBalance) From 649402cb59590be1bd245814a1e5f0897f94c862 Mon Sep 17 00:00:00 2001 From: bznein Date: Thu, 18 Jul 2024 15:11:21 +0100 Subject: [PATCH 4/7] Appeasing the linter --- e2e/tests/transfer/forwarding_test.go | 4 ++-- e2e/testsuite/testsuite.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/e2e/tests/transfer/forwarding_test.go b/e2e/tests/transfer/forwarding_test.go index cc6096212c4..f65769a9ad7 100644 --- a/e2e/tests/transfer/forwarding_test.go +++ b/e2e/tests/transfer/forwarding_test.go @@ -355,11 +355,11 @@ func (s *TransferForwardingTestSuite) TestFailedForwarding() { }) t.Run("balances for B and C have not changed", func(t *testing.T) { - chainBBalance, err := s.GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) + chainBBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) s.Require().NoError(err) s.Require().Equal(chainBstartingBalance, chainBBalance) - chainCBalance, err := s.GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) + chainCBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) s.Require().NoError(err) s.Require().Equal(chainCstartingBalance, chainCBalance) }) diff --git a/e2e/testsuite/testsuite.go b/e2e/testsuite/testsuite.go index a292069fdeb..bda4fb3e73d 100644 --- a/e2e/testsuite/testsuite.go +++ b/e2e/testsuite/testsuite.go @@ -564,17 +564,17 @@ func (s *E2ETestSuite) createWalletOnChainIndex(ctx context.Context, amount, cha // GetChainANativeBalance gets the balance of a given user on chain A. func (s *E2ETestSuite) GetChainANativeBalance(ctx context.Context, user ibc.Wallet) (int64, error) { chainA := s.GetAllChains()[0] - return s.GetChainBalanceForDenom(ctx, chainA, chainA.Config().Denom, user) + return GetChainBalanceForDenom(ctx, chainA, chainA.Config().Denom, user) } // GetChainBNativeBalance gets the balance of a given user on chain B. func (s *E2ETestSuite) GetChainBNativeBalance(ctx context.Context, user ibc.Wallet) (int64, error) { chainB := s.GetAllChains()[1] - return s.GetChainBalanceForDenom(ctx, chainB, chainB.Config().Denom, user) + return GetChainBalanceForDenom(ctx, chainB, chainB.Config().Denom, user) } // GetChainBalanceForDenom returns the balance for a given denom given a chain. -func (s *E2ETestSuite) GetChainBalanceForDenom(ctx context.Context, chain ibc.Chain, denom string, user ibc.Wallet) (int64, error) { +func GetChainBalanceForDenom(ctx context.Context, chain ibc.Chain, denom string, user ibc.Wallet) (int64, error) { balanceResp, err := query.GRPCQuery[banktypes.QueryBalanceResponse](ctx, chain, &banktypes.QueryBalanceRequest{ Address: user.FormattedAddress(), Denom: denom, From 25cd1d24568846cde13e8e68e1603498dd2ea034 Mon Sep 17 00:00:00 2001 From: bznein Date: Thu, 18 Jul 2024 15:16:42 +0100 Subject: [PATCH 5/7] Missed renaming --- e2e/tests/transfer/forwarding_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/tests/transfer/forwarding_test.go b/e2e/tests/transfer/forwarding_test.go index f65769a9ad7..e25fe288b1c 100644 --- a/e2e/tests/transfer/forwarding_test.go +++ b/e2e/tests/transfer/forwarding_test.go @@ -317,10 +317,10 @@ func (s *TransferForwardingTestSuite) TestFailedForwarding() { s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks") - chainBstartingBalance, err := s.GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) + chainBstartingBalance, err := GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) s.Require().NoError(err) - chainCstartingBalance, err := s.GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) + chainCstartingBalance, err := GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) s.Require().NoError(err) t.Run("native IBC token transfer from chainA to invalid address through B", func(t *testing.T) { From ebbc9096ce4bd33a4ab350462b4d5dc3ec4f3ed9 Mon Sep 17 00:00:00 2001 From: bznein Date: Thu, 18 Jul 2024 15:36:18 +0100 Subject: [PATCH 6/7] Fix --- e2e/tests/transfer/forwarding_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/tests/transfer/forwarding_test.go b/e2e/tests/transfer/forwarding_test.go index e25fe288b1c..102cb552650 100644 --- a/e2e/tests/transfer/forwarding_test.go +++ b/e2e/tests/transfer/forwarding_test.go @@ -317,10 +317,10 @@ func (s *TransferForwardingTestSuite) TestFailedForwarding() { s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks") - chainBstartingBalance, err := GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) + chainBstartingBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) s.Require().NoError(err) - chainCstartingBalance, err := GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) + chainCstartingBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) s.Require().NoError(err) t.Run("native IBC token transfer from chainA to invalid address through B", func(t *testing.T) { From 1c2166baf5a957585f84c02b5187798d2df7283c Mon Sep 17 00:00:00 2001 From: bznein Date: Fri, 19 Jul 2024 09:10:19 +0100 Subject: [PATCH 7/7] Change denom. --- e2e/tests/transfer/forwarding_test.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/e2e/tests/transfer/forwarding_test.go b/e2e/tests/transfer/forwarding_test.go index 102cb552650..6bb21f49042 100644 --- a/e2e/tests/transfer/forwarding_test.go +++ b/e2e/tests/transfer/forwarding_test.go @@ -317,12 +317,6 @@ func (s *TransferForwardingTestSuite) TestFailedForwarding() { s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks") - chainBstartingBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) - s.Require().NoError(err) - - chainCstartingBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) - s.Require().NoError(err) - t.Run("native IBC token transfer from chainA to invalid address through B", func(t *testing.T) { inFiveMinutes := time.Now().Add(5 * time.Minute).UnixNano() forwarding := transfertypes.NewForwarding(false, transfertypes.NewHop(channelBtoC.PortID, channelBtoC.ChannelID)) @@ -355,12 +349,14 @@ func (s *TransferForwardingTestSuite) TestFailedForwarding() { }) t.Run("balances for B and C have not changed", func(t *testing.T) { - chainBBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainB, chainADenom, chainBWallet) + chainBIBCToken := testsuite.GetIBCToken(chainADenom, channelAtoB.Counterparty.PortID, channelAtoB.Counterparty.ChannelID) // IBC token sent to chainB + chainBBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainB, chainBIBCToken.IBCDenom(), chainBWallet) s.Require().NoError(err) - s.Require().Equal(chainBstartingBalance, chainBBalance) + s.Require().Zero(chainBBalance) - chainCBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainC, chainADenom, chainCWallet) + chainCIBCToken := testsuite.GetIBCToken(chainBIBCToken.IBCDenom(), channelBtoC.Counterparty.PortID, channelBtoC.Counterparty.ChannelID) // IBC token sent to chainC + chainCBalance, err := testsuite.GetChainBalanceForDenom(ctx, chainC, chainCIBCToken.IBCDenom(), chainCWallet) s.Require().NoError(err) - s.Require().Equal(chainCstartingBalance, chainCBalance) + s.Require().Zero(chainCBalance) }) }