Skip to content

Commit d31b517

Browse files
committed
create token transfer test
1 parent a4e05b3 commit d31b517

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,10 @@ ictest-ratelimit:
290290
@echo "Running rate limit e2e test"
291291
@cd interchaintest && go test -race -v -run TestIBCRateLimit .
292292

293+
ictest-token-transfer:
294+
@echo "Running token transfer e2e test"
295+
@cd interchaintest && go test -race -v -run TestTokenTransfer .
296+
293297
###############################################################################
294298
### testnet ###
295299
###############################################################################
@@ -340,6 +344,7 @@ help:
340344
@echo " sh-testnet : Shell local devnet"
341345
@echo " ictest-basic : Basic end-to-end test"
342346
@echo " ictest-ibc : IBC end-to-end test"
347+
@echo " ictest-token-transfer : Token transfer between users end-to-end test"
343348
@echo " generate-webapp : Create a new webapp template"
344349

345350
.PHONY: help
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package e2e
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"cosmossdk.io/math"
8+
9+
"github.com/strangelove-ventures/interchaintest/v8"
10+
"github.com/strangelove-ventures/interchaintest/v8/chain/cosmos"
11+
"github.com/strangelove-ventures/interchaintest/v8/ibc"
12+
"github.com/strangelove-ventures/interchaintest/v8/testreporter"
13+
"github.com/stretchr/testify/require"
14+
"go.uber.org/zap/zaptest"
15+
)
16+
17+
func TestTokenTransfer(t *testing.T) {
18+
ctx := context.Background()
19+
rep := testreporter.NewNopReporter()
20+
eRep := rep.RelayerExecReporter(t)
21+
client, network := interchaintest.DockerSetup(t)
22+
23+
cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{
24+
&DefaultChainSpec,
25+
})
26+
27+
chains, err := cf.Chains(t.Name())
28+
require.NoError(t, err)
29+
30+
chain := chains[0].(*cosmos.CosmosChain)
31+
32+
// Setup Interchain
33+
ic := interchaintest.NewInterchain().
34+
AddChain(chain)
35+
36+
require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{
37+
TestName: t.Name(),
38+
Client: client,
39+
NetworkID: network,
40+
SkipPathCreation: false,
41+
}))
42+
t.Cleanup(func() {
43+
_ = ic.Close()
44+
})
45+
46+
// Create and fund two users
47+
initialAmount := math.NewInt(10_000_000)
48+
users := interchaintest.GetAndFundTestUsers(t, ctx, "default", initialAmount, chain, chain)
49+
require.Len(t, users, 2, "Expected 2 users to be created and funded")
50+
51+
sender := users[0]
52+
receiver := users[1]
53+
54+
t.Run("validate initial funding", func(t *testing.T) {
55+
// Check that both users have the expected initial balance
56+
senderBal, err := chain.BankQueryBalance(ctx, sender.FormattedAddress(), chain.Config().Denom)
57+
require.NoError(t, err)
58+
require.EqualValues(t, initialAmount, senderBal)
59+
60+
receiverBal, err := chain.BankQueryBalance(ctx, receiver.FormattedAddress(), chain.Config().Denom)
61+
require.NoError(t, err)
62+
require.EqualValues(t, initialAmount, receiverBal)
63+
})
64+
65+
t.Run("transfer tokens between users", func(t *testing.T) {
66+
// Transfer amount
67+
transferAmount := math.NewInt(1_000_000)
68+
69+
// Perform the transfer from sender to receiver
70+
transfer := ibc.WalletAmount{
71+
Address: receiver.FormattedAddress(),
72+
Denom: chain.Config().Denom,
73+
Amount: transferAmount,
74+
}
75+
err := chain.SendFunds(ctx, sender.KeyName(), transfer)
76+
require.NoError(t, err, "Failed to send funds from sender to receiver")
77+
78+
// Verify the balances after transfer
79+
senderBal, err := chain.BankQueryBalance(ctx, sender.FormattedAddress(), chain.Config().Denom)
80+
require.NoError(t, err)
81+
expectedSenderBal := initialAmount.Sub(transferAmount)
82+
require.EqualValues(t, expectedSenderBal, senderBal, "Sender balance incorrect after transfer")
83+
84+
receiverBal, err := chain.BankQueryBalance(ctx, receiver.FormattedAddress(), chain.Config().Denom)
85+
require.NoError(t, err)
86+
expectedReceiverBal := initialAmount.Add(transferAmount)
87+
require.EqualValues(t, expectedReceiverBal, receiverBal, "Receiver balance incorrect after transfer")
88+
})
89+
90+
t.Run("transfer tokens back", func(t *testing.T) {
91+
// Transfer amount for the return transfer
92+
returnAmount := math.NewInt(500_000)
93+
94+
// Get balances before the return transfer
95+
senderBalBefore, err := chain.BankQueryBalance(ctx, sender.FormattedAddress(), chain.Config().Denom)
96+
require.NoError(t, err)
97+
98+
receiverBalBefore, err := chain.BankQueryBalance(ctx, receiver.FormattedAddress(), chain.Config().Denom)
99+
require.NoError(t, err)
100+
101+
// Perform the transfer from receiver back to sender
102+
returnTransfer := ibc.WalletAmount{
103+
Address: sender.FormattedAddress(),
104+
Denom: chain.Config().Denom,
105+
Amount: returnAmount,
106+
}
107+
err = chain.SendFunds(ctx, receiver.KeyName(), returnTransfer)
108+
require.NoError(t, err, "Failed to send funds from receiver back to sender")
109+
110+
// Verify the balances after the return transfer
111+
senderBalAfter, err := chain.BankQueryBalance(ctx, sender.FormattedAddress(), chain.Config().Denom)
112+
require.NoError(t, err)
113+
expectedSenderBalAfter := senderBalBefore.Add(returnAmount)
114+
require.EqualValues(t, expectedSenderBalAfter, senderBalAfter, "Sender balance incorrect after return transfer")
115+
116+
receiverBalAfter, err := chain.BankQueryBalance(ctx, receiver.FormattedAddress(), chain.Config().Denom)
117+
require.NoError(t, err)
118+
expectedReceiverBalAfter := receiverBalBefore.Sub(returnAmount)
119+
require.EqualValues(t, expectedReceiverBalAfter, receiverBalAfter, "Receiver balance incorrect after return transfer")
120+
})
121+
}

0 commit comments

Comments
 (0)