From 1cf388536d8d6423066114103f0c174484703b24 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Wed, 24 Dec 2025 18:32:29 +0400 Subject: [PATCH 01/10] add e2e test for account module - signing and tx ordering --- interchaintest/txs_auth_test.go | 91 +++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 interchaintest/txs_auth_test.go diff --git a/interchaintest/txs_auth_test.go b/interchaintest/txs_auth_test.go new file mode 100644 index 00000000..1928ca64 --- /dev/null +++ b/interchaintest/txs_auth_test.go @@ -0,0 +1,91 @@ +package interchaintest + +import ( + "context" + "fmt" + "testing" + + "cosmossdk.io/math" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/interchaintest/v10" + "github.com/cosmos/interchaintest/v10/ibc" + "github.com/stretchr/testify/require" + + "github.com/persistenceOne/persistenceCore/v17/interchaintest/helpers" +) + +// TestTxAuthSignModesAndOrdering executes 6 independent bank sends to cover: +// - ordered (default delivery): direct, amino-json, textual +// - unordered (with timeout): direct, amino-json, textual +// Each tx uses a distinct from_user, so no sleeps are required and execution is fast. +func TestTxAuthSignModesAndOrdering(t *testing.T) { + if testing.Short() { + t.Skip() + } + + t.Parallel() + + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + // Single chain with 1 validator is sufficient + validators := 1 + ic, chain := CreateChain(t, ctx, validators, 0) + require.NotNil(t, ic) + require.NotNil(t, chain) + defer func() { _ = ic.Close() }() + + chainNode := chain.Nodes()[0] + denom := chain.Config().Denom + + // Create 6 independent senders and 1 common recipient + fromFunds := math.NewInt(1_000_000) // enough for amount + fees + var senders []ibc.Wallet + for i := 1; i <= 6; i++ { + name := fmt.Sprintf("%s-from-%d", t.Name(), i) + u := interchaintest.GetAndFundTestUsers(t, ctx, name, fromFunds, chain)[0] + senders = append(senders, u) + } + + toFunds := math.NewInt(1_000_000) + toUser := interchaintest.GetAndFundTestUsers(t, ctx, fmt.Sprintf("%s-to", t.Name()), toFunds, chain)[0] + + amount := sdk.NewCoin(denom, math.NewInt(100_000)) + + doSend := func(sender ibc.Wallet, signMode string, unordered bool) { + cmd := []string{ + "bank", "send", + sender.FormattedAddress(), + toUser.FormattedAddress(), + amount.String(), + "--gas=auto", + "--sign-mode", signMode, + } + if unordered { + cmd = append(cmd, "--unordered", "--timeout-duration=10s") + } + + txHash, err := chainNode.ExecTx(ctx, sender.KeyName(), cmd...) + require.NoError(t, err) + _, err = helpers.QueryTx(ctx, chainNode, txHash) + require.NoError(t, err) + } + + beforeTo, err := chain.GetBalance(ctx, toUser.FormattedAddress(), denom) + require.NoError(t, err) + + // Ordered (default) deliveries + doSend(senders[0], "direct", false) + doSend(senders[1], "amino-json", false) + doSend(senders[2], "textual", false) + + // Unordered deliveries (with timeout) + doSend(senders[3], "direct", true) + doSend(senders[4], "amino-json", true) + doSend(senders[5], "textual", true) + + afterTo, err := chain.GetBalance(ctx, toUser.FormattedAddress(), denom) + require.NoError(t, err) + require.Equal(t, beforeTo.Add(amount.Amount.MulRaw(6)), afterTo, "recipient should receive 6 transfers") +} From a00d0be1e7ae8153a93cf15c6f4efe6104635751 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Wed, 24 Dec 2025 18:32:35 +0400 Subject: [PATCH 02/10] add make command --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index ae3d0720..82c90a29 100644 --- a/Makefile +++ b/Makefile @@ -307,6 +307,10 @@ ictest-liquidstake: rm-testcache ictest-liquidstake-all: rm-testcache cd interchaintest && go test -race -v -run "(TestLiquidStakeStkXPRT|TestLiquidStakeUnstakeStkXPRT|TestPauseLiquidStakeStkXPRT)" . +# Executes different tx types +ictest-txs-auth: rm-testcache + cd interchaintest && go test -race -v -run "(TestTxAuthSignModesAndOrdering)" . + rm-testcache: go clean -testcache From a668e162d4083bb0e938d3258ad92d554bfdac59 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Wed, 24 Dec 2025 18:32:45 +0400 Subject: [PATCH 03/10] add to gh ci --- .github/workflows/e2e-testing.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/e2e-testing.yaml b/.github/workflows/e2e-testing.yaml index a7a3defa..312ab8fa 100644 --- a/.github/workflows/e2e-testing.yaml +++ b/.github/workflows/e2e-testing.yaml @@ -88,6 +88,7 @@ jobs: - "ictest-pfm" - "ictest-lsm" - "ictest-liquidstake" + - "ictest-txs-auth" fail-fast: false steps: From e143846914fd9172a1db85693b5e7fa3c4361fa7 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Wed, 24 Dec 2025 20:11:58 +0400 Subject: [PATCH 04/10] try fix --- interchaintest/txs_auth_test.go | 37 ++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/interchaintest/txs_auth_test.go b/interchaintest/txs_auth_test.go index 1928ca64..d83c28b9 100644 --- a/interchaintest/txs_auth_test.go +++ b/interchaintest/txs_auth_test.go @@ -3,13 +3,17 @@ package interchaintest import ( "context" "fmt" + "strings" "testing" + "time" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/interchaintest/v10" + "github.com/cosmos/interchaintest/v10/chain/cosmos" "github.com/cosmos/interchaintest/v10/ibc" + "github.com/cosmos/interchaintest/v10/testutil" "github.com/stretchr/testify/require" "github.com/persistenceOne/persistenceCore/v17/interchaintest/helpers" @@ -24,10 +28,8 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { t.Skip() } - t.Parallel() - - ctx, cancel := context.WithCancel(context.Background()) - t.Cleanup(cancel) + ctx := context.Background() + t.Cleanup(func() {}) // Single chain with 1 validator is sufficient validators := 1 @@ -36,6 +38,9 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { require.NotNil(t, chain) defer func() { _ = ic.Close() }() + // ensure chain has produced at least one block before first tx + require.NoError(t, testutil.WaitForBlocks(ctx, 1, chain)) + chainNode := chain.Nodes()[0] denom := chain.Config().Denom @@ -53,6 +58,28 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { amount := sdk.NewCoin(denom, math.NewInt(100_000)) + // retry wrapper to reduce flakiness due to transient RPC hiccups in CI + execTxWithRetry := func(ctx context.Context, node *cosmos.ChainNode, key string, cmd ...string) (string, error) { + var lastErr error + for i := 0; i < i; i++ { + t.Logf("Exec attempt %d: %v", i+1, append([]string{"persistenceCore", "tx"}, cmd...)) + txHash, err := node.ExecTx(ctx, key, cmd...) + if err == nil { + return txHash, nil + } + lastErr = err + emsg := err.Error() + // retry on typical transient errors observed in CI + if strings.Contains(emsg, "connection refused") || strings.Contains(emsg, "post failed") || strings.Contains(emsg, "EOF") || strings.Contains(emsg, "i/o timeout") || strings.Contains(emsg, "transport is closing") { + time.Sleep(time.Duration(i+1) * 500 * time.Millisecond) + continue + } + // non-transient + return "", err + } + return "", lastErr + } + doSend := func(sender ibc.Wallet, signMode string, unordered bool) { cmd := []string{ "bank", "send", @@ -66,7 +93,7 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { cmd = append(cmd, "--unordered", "--timeout-duration=10s") } - txHash, err := chainNode.ExecTx(ctx, sender.KeyName(), cmd...) + txHash, err := execTxWithRetry(ctx, chainNode, sender.KeyName(), cmd...) require.NoError(t, err) _, err = helpers.QueryTx(ctx, chainNode, txHash) require.NoError(t, err) From 6bc44c09be2657336f6712be9f0c6193a37440cf Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Wed, 24 Dec 2025 20:27:16 +0400 Subject: [PATCH 05/10] try fix --- interchaintest/txs_auth_test.go | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/interchaintest/txs_auth_test.go b/interchaintest/txs_auth_test.go index d83c28b9..b50b55b9 100644 --- a/interchaintest/txs_auth_test.go +++ b/interchaintest/txs_auth_test.go @@ -3,15 +3,12 @@ package interchaintest import ( "context" "fmt" - "strings" "testing" - "time" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/interchaintest/v10" - "github.com/cosmos/interchaintest/v10/chain/cosmos" "github.com/cosmos/interchaintest/v10/ibc" "github.com/cosmos/interchaintest/v10/testutil" "github.com/stretchr/testify/require" @@ -58,28 +55,6 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { amount := sdk.NewCoin(denom, math.NewInt(100_000)) - // retry wrapper to reduce flakiness due to transient RPC hiccups in CI - execTxWithRetry := func(ctx context.Context, node *cosmos.ChainNode, key string, cmd ...string) (string, error) { - var lastErr error - for i := 0; i < i; i++ { - t.Logf("Exec attempt %d: %v", i+1, append([]string{"persistenceCore", "tx"}, cmd...)) - txHash, err := node.ExecTx(ctx, key, cmd...) - if err == nil { - return txHash, nil - } - lastErr = err - emsg := err.Error() - // retry on typical transient errors observed in CI - if strings.Contains(emsg, "connection refused") || strings.Contains(emsg, "post failed") || strings.Contains(emsg, "EOF") || strings.Contains(emsg, "i/o timeout") || strings.Contains(emsg, "transport is closing") { - time.Sleep(time.Duration(i+1) * 500 * time.Millisecond) - continue - } - // non-transient - return "", err - } - return "", lastErr - } - doSend := func(sender ibc.Wallet, signMode string, unordered bool) { cmd := []string{ "bank", "send", @@ -93,8 +68,9 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { cmd = append(cmd, "--unordered", "--timeout-duration=10s") } - txHash, err := execTxWithRetry(ctx, chainNode, sender.KeyName(), cmd...) + txHash, err := chainNode.ExecTx(ctx, sender.KeyName(), cmd...) require.NoError(t, err) + require.NotEmpty(t, txHash) _, err = helpers.QueryTx(ctx, chainNode, txHash) require.NoError(t, err) } From 84f577888ddebe48351f3904c22b615ee09d5825 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Wed, 24 Dec 2025 20:58:36 +0400 Subject: [PATCH 06/10] try fix --- interchaintest/txs_auth_test.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/interchaintest/txs_auth_test.go b/interchaintest/txs_auth_test.go index b50b55b9..a59d4a4a 100644 --- a/interchaintest/txs_auth_test.go +++ b/interchaintest/txs_auth_test.go @@ -24,17 +24,22 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { if testing.Short() { t.Skip() } + t.Parallel() - ctx := context.Background() - t.Cleanup(func() {}) + ctx, cancelFn := context.WithCancel(context.Background()) + t.Cleanup(func() { + cancelFn() + }) // Single chain with 1 validator is sufficient validators := 1 ic, chain := CreateChain(t, ctx, validators, 0) require.NotNil(t, ic) require.NotNil(t, chain) - defer func() { _ = ic.Close() }() + t.Cleanup(func() { + _ = ic.Close() + }) // ensure chain has produced at least one block before first tx require.NoError(t, testutil.WaitForBlocks(ctx, 1, chain)) From 632c43c0d2af49c4610e85f4e8a923b8474b2aa4 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Wed, 24 Dec 2025 21:07:11 +0400 Subject: [PATCH 07/10] try fix --- interchaintest/txs_auth_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interchaintest/txs_auth_test.go b/interchaintest/txs_auth_test.go index a59d4a4a..67d11b02 100644 --- a/interchaintest/txs_auth_test.go +++ b/interchaintest/txs_auth_test.go @@ -66,7 +66,7 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { sender.FormattedAddress(), toUser.FormattedAddress(), amount.String(), - "--gas=auto", + "--gas", "auto", "--sign-mode", signMode, } if unordered { @@ -85,13 +85,13 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { // Ordered (default) deliveries doSend(senders[0], "direct", false) - doSend(senders[1], "amino-json", false) doSend(senders[2], "textual", false) + doSend(senders[1], "amino-json", false) // Unordered deliveries (with timeout) doSend(senders[3], "direct", true) - doSend(senders[4], "amino-json", true) doSend(senders[5], "textual", true) + doSend(senders[4], "amino-json", true) afterTo, err := chain.GetBalance(ctx, toUser.FormattedAddress(), denom) require.NoError(t, err) From b0b6abd6ea8d9b10ca8ebe9fe21647cc52529e34 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Wed, 24 Dec 2025 21:50:04 +0400 Subject: [PATCH 08/10] try fix --- interchaintest/txs_auth_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interchaintest/txs_auth_test.go b/interchaintest/txs_auth_test.go index 67d11b02..4ede94b6 100644 --- a/interchaintest/txs_auth_test.go +++ b/interchaintest/txs_auth_test.go @@ -85,13 +85,13 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { // Ordered (default) deliveries doSend(senders[0], "direct", false) - doSend(senders[2], "textual", false) - doSend(senders[1], "amino-json", false) + doSend(senders[1], "textual", false) + doSend(senders[2], "amino-json", false) // Unordered deliveries (with timeout) doSend(senders[3], "direct", true) - doSend(senders[5], "textual", true) - doSend(senders[4], "amino-json", true) + doSend(senders[4], "textual", true) + doSend(senders[5], "amino-json", true) afterTo, err := chain.GetBalance(ctx, toUser.FormattedAddress(), denom) require.NoError(t, err) From 30085042f7dcdf74456c96b3a182e12ddc8f8465 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Thu, 25 Dec 2025 12:59:56 +0400 Subject: [PATCH 09/10] increase timeout duration --- interchaintest/txs_auth_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interchaintest/txs_auth_test.go b/interchaintest/txs_auth_test.go index 4ede94b6..2c2ed9f1 100644 --- a/interchaintest/txs_auth_test.go +++ b/interchaintest/txs_auth_test.go @@ -66,11 +66,11 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { sender.FormattedAddress(), toUser.FormattedAddress(), amount.String(), - "--gas", "auto", - "--sign-mode", signMode, + "--gas=auto", + fmt.Sprintf("--sign-mode=%s", signMode), } if unordered { - cmd = append(cmd, "--unordered", "--timeout-duration=10s") + cmd = append(cmd, "--unordered", "--timeout-duration=20s") } txHash, err := chainNode.ExecTx(ctx, sender.KeyName(), cmd...) From 2cebd6f22d6456c12950d787c7306156c1214d22 Mon Sep 17 00:00:00 2001 From: puneetmahajan Date: Thu, 25 Dec 2025 13:10:22 +0400 Subject: [PATCH 10/10] do textual last --- interchaintest/txs_auth_test.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/interchaintest/txs_auth_test.go b/interchaintest/txs_auth_test.go index 2c2ed9f1..0f8665c8 100644 --- a/interchaintest/txs_auth_test.go +++ b/interchaintest/txs_auth_test.go @@ -83,15 +83,14 @@ func TestTxAuthSignModesAndOrdering(t *testing.T) { beforeTo, err := chain.GetBalance(ctx, toUser.FormattedAddress(), denom) require.NoError(t, err) - // Ordered (default) deliveries doSend(senders[0], "direct", false) - doSend(senders[1], "textual", false) + doSend(senders[1], "direct", true) + doSend(senders[2], "amino-json", false) + doSend(senders[3], "amino-json", true) - // Unordered deliveries (with timeout) - doSend(senders[3], "direct", true) - doSend(senders[4], "textual", true) - doSend(senders[5], "amino-json", true) + doSend(senders[4], "textual", false) + doSend(senders[5], "textual", true) afterTo, err := chain.GetBalance(ctx, toUser.FormattedAddress(), denom) require.NoError(t, err)