//go:build !test_e2e package transfer import ( "context" "testing" test "github.com/cosmos/interchaintest/v10/testutil" testifysuite "github.com/stretchr/testify/suite" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" paramsproposaltypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal" "github.com/cosmos/ibc-go/e2e/testsuite" "github.com/cosmos/ibc-go/e2e/testsuite/query" "github.com/cosmos/ibc-go/e2e/testvalues" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" ibctesting "github.com/cosmos/ibc-go/v10/testing" ) // compatibility:from_version: v7.10.0 func TestTransferTestSuiteSendReceive(t *testing.T) { testifysuite.Run(t, new(TransferTestSuiteSendReceive)) } type TransferTestSuiteSendReceive struct { transferTester } func (s *TransferTestSuiteSendReceive) SetupSuite() { s.SetupChains(context.TODO(), 2, nil, func(options *testsuite.ChainOptions) { options.RelayerCount = 1 }) } // TestReceiveEnabledParam tests changing ics20 ReceiveEnabled parameter func (s *TransferTestSuiteSendReceive) TestReceiveEnabledParam() { t := s.T() ctx := context.TODO() testName := t.Name() // Note: explicitly not using t.Parallel() in this test as it makes chain wide changes s.CreateTransferPath(testName) chainA, chainB := s.GetChains() relayer := s.GetRelayerForTest(testName) channelA := s.GetChainAChannelForTest(testName) chainAVersion := chainA.Config().Images[0].Version chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount) chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount) var ( chainBDenom = chainB.Config().Denom chainAIBCToken = testsuite.GetIBCToken(chainBDenom, channelA.PortID, channelA.ChannelID) // IBC token sent to chainA chainAAddress = chainAWallet.FormattedAddress() chainBAddress = chainBWallet.FormattedAddress() ) isSelfManagingParams := testvalues.SelfParamsFeatureReleases.IsSupported(chainAVersion) govModuleAddress, err := query.ModuleAccountAddress(ctx, govtypes.ModuleName, chainA) s.Require().NoError(err) s.Require().NotNil(govModuleAddress) s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks") t.Run("ensure transfer receive is enabled", func(t *testing.T) { enabled := s.QueryTransferParams(ctx, chainA).ReceiveEnabled s.Require().True(enabled) }) t.Run("ensure packets can be received, send from chainB to chainA", func(t *testing.T) { t.Run("send from chainB to chainA", func(t *testing.T) { transferTxResp := s.Transfer(ctx, chainB, chainBWallet, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, testvalues.DefaultTransferAmount(chainBDenom), chainBAddress, chainAAddress, s.GetTimeoutHeight(ctx, chainA), 0, "") s.AssertTxSuccess(transferTxResp) }) t.Run("tokens are escrowed", func(t *testing.T) { actualBalance, err := s.GetChainBNativeBalance(ctx, chainBWallet) 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, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, 1) actualBalance, err := query.Balance(ctx, chainA, chainAAddress, chainAIBCToken.IBCDenom()) s.Require().NoError(err) expected := testvalues.IBCTransferAmount s.Require().Equal(expected, actualBalance.Int64()) }) t.Run("stop relayer", func(t *testing.T) { s.StopRelayer(ctx, relayer) }) }) t.Run("change receive enabled parameter to disabled ", func(t *testing.T) { if isSelfManagingParams { msg := transfertypes.NewMsgUpdateParams(govModuleAddress.String(), transfertypes.NewParams(false, false)) s.ExecuteAndPassGovV1Proposal(ctx, msg, chainA, chainAWallet) } else { changes := []paramsproposaltypes.ParamChange{ paramsproposaltypes.NewParamChange(transfertypes.StoreKey, string(transfertypes.KeyReceiveEnabled), "false"), } proposal := paramsproposaltypes.NewParameterChangeProposal(ibctesting.Title, ibctesting.Description, changes) s.ExecuteAndPassGovV1Beta1Proposal(ctx, chainA, chainAWallet, proposal) } }) t.Run("ensure transfer params are disabled", func(t *testing.T) { enabled := s.QueryTransferParams(ctx, chainA).ReceiveEnabled s.Require().False(enabled) }) t.Run("ensure ics20 transfer fails", func(t *testing.T) { t.Run("send from chainB to chainA", func(t *testing.T) { transferTxResp := s.Transfer(ctx, chainB, chainBWallet, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID, testvalues.DefaultTransferAmount(chainBDenom), chainBAddress, chainAAddress, s.GetTimeoutHeight(ctx, chainA), 0, "") s.AssertTxSuccess(transferTxResp) }) t.Run("tokens are escrowed", func(t *testing.T) { actualBalance, err := s.GetChainBNativeBalance(ctx, chainBWallet) s.Require().NoError(err) expected := testvalues.StartingTokenAmount - (testvalues.IBCTransferAmount * 2) // second send s.Require().Equal(expected, actualBalance) }) t.Run("start relayer", func(t *testing.T) { s.StartRelayer(relayer, testName) }) t.Run("tokens are unescrowed in failed acknowledgement", func(t *testing.T) { actualBalance, err := s.GetChainBNativeBalance(ctx, chainBWallet) s.Require().NoError(err) expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount // only first send marked s.Require().Equal(expected, actualBalance) }) }) }