Skip to content

Commit 2f98c7e

Browse files
vladjdkwllmshao
andauthored
test: add e2e tests for ibc classic callbacks (#3609)
* test: add e2e tests for ibc v2 rate limiting * skip go test ibc classic * hermes clear packet * printf -> logs * remove branch artifact * lints * increase gas on instantiate * change cw code to value after cw test * fix deployed contracts number --------- Co-authored-by: wllmshao <[email protected]>
1 parent f38a3a9 commit 2f98c7e

9 files changed

+175
-6
lines changed

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ require (
2727
github.com/cosmos/go-bip39 v1.0.0
2828
github.com/cosmos/gogoproto v1.7.0
2929
github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v10 v10.0.0-beta.2
30+
github.com/cosmos/ibc-go/modules/apps/callbacks/v10 v10.0.0-rc.2
3031
github.com/cosmos/ibc-apps/modules/rate-limiting/v10 v10.0.0-beta.2-bugfix.2
3132
github.com/cosmos/ibc-go/modules/light-clients/08-wasm/v10 v10.0.0-rc.3
3233
github.com/cosmos/ibc-go/v10 v10.0.0

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,8 @@ github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v10 v10.0.0-beta
456456
github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v10 v10.0.0-beta.2/go.mod h1:+oU4GGDP51P1A+W8WMTcx9kHdyRmX3uunECdFD2KpNU=
457457
github.com/cosmos/ibc-apps/modules/rate-limiting/v10 v10.0.0-beta.2-bugfix.2 h1:kXts6XE2zkh+jJiXIdVWNI5jrma1I1r2fjj42LpGvKM=
458458
github.com/cosmos/ibc-apps/modules/rate-limiting/v10 v10.0.0-beta.2-bugfix.2/go.mod h1:C5pSCd/vGT2XYlxHlGs0B13J8TjIJbwe2Ytf6q0FKCY=
459+
github.com/cosmos/ibc-go/modules/apps/callbacks/v10 v10.0.0-rc.2 h1:K1/MEYoIYv/s5s3jfdrxcnO7aGTBAJC5oIq+ekUn4Zc=
460+
github.com/cosmos/ibc-go/modules/apps/callbacks/v10 v10.0.0-rc.2/go.mod h1:9IfwYIf8FbaeWYKH0JDoreujwBxZa+8yOStSfcAlguk=
459461
github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI=
460462
github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E=
461463
github.com/cosmos/ibc-go/modules/light-clients/08-wasm/v10 v10.0.0-rc.3 h1:gsjb6aMkZZkUsKM4JHAWo+oxgpByjbEYU4Hf+4vWqLc=
382 KB
Binary file not shown.
Binary file not shown.

tests/e2e/e2e_callbacks_test.go

+128
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package e2e
2+
3+
import (
4+
"context"
5+
"crypto/sha256"
6+
"fmt"
7+
"os"
8+
"path/filepath"
9+
"time"
10+
11+
"github.com/stretchr/testify/assert/yaml"
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
const (
16+
Sha256SkipEntryPoint = "4ee07a1474cb1429cfbdba98fb52ca2efc2fe8602f8e1978dbc3f45b71511ca9"
17+
Sha256SkipAdapterIBCCallbacks = "21c375f75e09197478cd345b0a6376824a75471d8e22577dc36b74739277f027"
18+
SaltHex = "74657374696e67" // "testing" hex encoded
19+
RecipientAddress = "cosmos1hrgj37s5dcqrte6srj9p2uqul3nxpmmqfhqp67"
20+
)
21+
22+
func (s *IntegrationTestSuite) testCallbacksCWSkipGo() {
23+
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
24+
defer cancel()
25+
chainEndpoint := fmt.Sprintf("http://%s", s.valResources[s.chainA.id][0].GetHostPort("1317/tcp"))
26+
27+
valIdx := 0
28+
val := s.chainA.validators[valIdx]
29+
address, _ := val.keyInfo.GetAddress()
30+
sender := address.String()
31+
dirName, err := os.Getwd()
32+
s.Require().NoError(err)
33+
34+
// Copy file to container path and store the contract
35+
entryPointSrc := filepath.Join(dirName, "data/skip_go_entry_point.wasm")
36+
entryPointDst := filepath.Join(val.configDir(), "config", "skip_go_entry_point.wasm")
37+
_, err = copyFile(entryPointSrc, entryPointDst)
38+
s.Require().NoError(err)
39+
storeWasmPath := configFile("skip_go_entry_point.wasm")
40+
s.storeWasm(ctx, s.chainA, valIdx, sender, storeWasmPath)
41+
42+
adapterSrc := filepath.Join(dirName, "data/skip_go_ibc_adapter_ibc_callbacks.wasm")
43+
adapterDst := filepath.Join(val.configDir(), "config", "skip_go_ibc_adapter_ibc_callbacks.wasm")
44+
_, err = copyFile(adapterSrc, adapterDst)
45+
s.Require().NoError(err)
46+
storeWasmPath = configFile("skip_go_ibc_adapter_ibc_callbacks.wasm")
47+
s.storeWasm(ctx, s.chainA, valIdx, sender, storeWasmPath)
48+
49+
entrypointPredictedAddress := s.queryBuildAddress(ctx, s.chainA, valIdx, Sha256SkipEntryPoint, sender, SaltHex)
50+
s.Require().NoError(err)
51+
52+
instantiateAdapterJSON := fmt.Sprintf(`{"entry_point_contract_address":"%s"}`, entrypointPredictedAddress)
53+
s.instantiateWasm(ctx, s.chainA, valIdx, sender, "3", instantiateAdapterJSON, "adapter")
54+
adapterAddress, err := queryWasmContractAddress(chainEndpoint, address.String(), 1)
55+
s.Require().NoError(err)
56+
57+
instantiateEntrypointJSON := fmt.Sprintf(`{"swap_venues":[], "ibc_transfer_contract_address": "%s"}`, adapterAddress)
58+
s.instantiate2Wasm(ctx, s.chainA, valIdx, sender, "2", instantiateEntrypointJSON, SaltHex, "entrypoint")
59+
entrypointAddress, err := queryWasmContractAddress(chainEndpoint, address.String(), 2)
60+
s.Require().Equal(entrypointPredictedAddress, entrypointAddress)
61+
s.Require().NoError(err)
62+
63+
s.T().Logf("Successfully deployed contracts: \nEntrypoint: %s\nAdapter:%s\n", entrypointAddress, adapterAddress)
64+
65+
str := "transfer/channel-0/uatom"
66+
h := sha256.New()
67+
h.Write([]byte(str))
68+
bs := h.Sum(nil)
69+
70+
recipientDenom := fmt.Sprintf("ibc/%X", bs)
71+
72+
ibcHooksData := fmt.Sprintf(`"wasm": {
73+
"contract": "%s",
74+
"msg": {
75+
"action": {
76+
"sent_asset": {
77+
"native": {
78+
"denom":"%s",
79+
"amount":"1"
80+
}
81+
},
82+
"exact_out": false,
83+
"timeout_timestamp": %d,
84+
"action": {
85+
"transfer":{
86+
"to_address": "%s"
87+
}
88+
}
89+
}
90+
}
91+
}`, entrypointAddress, recipientDenom, time.Now().Add(time.Minute).UnixNano(), RecipientAddress)
92+
destCallbackData := fmt.Sprintf(`"dest_callback": {
93+
"address": "%s",
94+
"gas_limit": "%d"
95+
}`, adapterAddress, 10_000_000)
96+
97+
memo := fmt.Sprintf("{%s,%s}", destCallbackData, ibcHooksData)
98+
99+
senderB, _ := s.chainB.validators[0].keyInfo.GetAddress()
100+
s.sendIBC(s.chainB, 0, senderB.String(), adapterAddress, "1uatom", "3000000uatom", memo, transferChannel, nil, false)
101+
s.hermesClearPacket(hermesConfigWithGasPrices, s.chainB.id, transferPort, transferChannel)
102+
103+
balances, err := queryGaiaAllBalances(chainEndpoint, RecipientAddress)
104+
if err != nil {
105+
return
106+
}
107+
108+
require.Equal(s.T(), balances[0].String(), "1"+recipientDenom)
109+
}
110+
111+
func (s *IntegrationTestSuite) queryBuildAddress(ctx context.Context, c *chain, valIdx int, codeHash, creatorAddress, saltHexEncoded string,
112+
) (res string) {
113+
cmd := []string{
114+
gaiadBinary,
115+
queryCommand,
116+
"wasm",
117+
"build-address",
118+
codeHash,
119+
creatorAddress,
120+
saltHexEncoded,
121+
}
122+
123+
s.executeGaiaTxCommand(ctx, c, cmd, valIdx, func(stdOut []byte, stdErr []byte) bool {
124+
s.Require().NoError(yaml.Unmarshal(stdOut, &res))
125+
return true
126+
})
127+
return res
128+
}

tests/e2e/e2e_cw_test.go

+32-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func (s *IntegrationTestSuite) testCWCounter() {
3333
// Instantiate the contract
3434
s.instantiateWasm(ctx, s.chainA, valIdx, sender, "1", "{\"count\":0}", "counter")
3535
chainEndpoint := fmt.Sprintf("http://%s", s.valResources[s.chainA.id][0].GetHostPort("1317/tcp"))
36-
contractAddr, err := queryWasmContractAddress(chainEndpoint, address.String())
36+
contractAddr, err := queryWasmContractAddress(chainEndpoint, address.String(), 0)
3737
s.Require().NoError(err)
3838

3939
// Execute the contract
@@ -64,7 +64,7 @@ func (s *IntegrationTestSuite) storeWasm(ctx context.Context, c *chain, valIdx i
6464
fmt.Sprintf("--from=%s", sender),
6565
fmt.Sprintf("--%s=%s", flags.FlagFees, standardFees.String()),
6666
fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id),
67-
"--gas=2000000",
67+
"--gas=5000000",
6868
"--keyring-backend=test",
6969
"--broadcast-mode=sync",
7070
"--output=json",
@@ -91,7 +91,7 @@ func (s *IntegrationTestSuite) instantiateWasm(ctx context.Context, c *chain, va
9191
fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id),
9292
fmt.Sprintf("--label=%s", label),
9393
"--no-admin",
94-
"--gas=250000",
94+
"--gas=500000",
9595
"--keyring-backend=test",
9696
"--broadcast-mode=sync",
9797
"--output=json",
@@ -103,6 +103,35 @@ func (s *IntegrationTestSuite) instantiateWasm(ctx context.Context, c *chain, va
103103
s.T().Log("successfully sent instantiate wasm tx")
104104
}
105105

106+
func (s *IntegrationTestSuite) instantiate2Wasm(ctx context.Context, c *chain, valIdx int, sender, codeID,
107+
msg, salt, label string,
108+
) {
109+
storeCmd := []string{
110+
gaiadBinary,
111+
txCommand,
112+
"wasm",
113+
"instantiate2",
114+
codeID,
115+
msg,
116+
salt,
117+
fmt.Sprintf("--from=%s", sender),
118+
fmt.Sprintf("--%s=%s", flags.FlagFees, standardFees.String()),
119+
fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id),
120+
fmt.Sprintf("--label=%s", label),
121+
"--no-admin",
122+
"--gas=250000",
123+
"--keyring-backend=test",
124+
"--broadcast-mode=sync",
125+
"--output=json",
126+
"-y",
127+
}
128+
129+
s.T().Logf("%s instantiating wasm on host chain %s", sender, s.chainB.id)
130+
131+
s.executeGaiaTxCommand(ctx, c, storeCmd, valIdx, s.defaultExecValidation(c, valIdx))
132+
s.T().Log("successfully sent instantiate2 wasm tx")
133+
}
134+
106135
func (s *IntegrationTestSuite) executeWasm(ctx context.Context, c *chain, valIdx int, sender, addr, msg string) {
107136
execCmd := []string{
108137
gaiadBinary,

tests/e2e/e2e_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var (
1717
runRateLimitTest = true
1818
runTxExtensionsTest = true
1919
runCWTest = true
20+
runCallbacksTest = true
2021
runIbcV2Test = true
2122
)
2223

@@ -158,3 +159,11 @@ func (s *IntegrationTestSuite) TestIbcV2() {
158159
s.testResetRateLimit(true)
159160
s.testRemoveRateLimit(true)
160161
}
162+
163+
func (s *IntegrationTestSuite) TestCallbacks() {
164+
if !runCallbacksTest {
165+
s.T().Skip()
166+
}
167+
168+
s.testCallbacksCWSkipGo()
169+
}

tests/e2e/query.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ func queryBlocksPerEpoch(endpoint string) (int64, error) {
376376
return response.Params.BlocksPerEpoch, nil
377377
}
378378

379-
func queryWasmContractAddress(endpoint, creator string) (string, error) {
379+
func queryWasmContractAddress(endpoint, creator string, idx uint64) (string, error) {
380380
body, err := httpGet(fmt.Sprintf("%s/cosmwasm/wasm/v1/contracts/creator/%s", endpoint, creator))
381381
if err != nil {
382382
return "", fmt.Errorf("failed to execute HTTP request: %w", err)
@@ -387,7 +387,7 @@ func queryWasmContractAddress(endpoint, creator string) (string, error) {
387387
return "", err
388388
}
389389

390-
return response.ContractAddresses[0], nil
390+
return response.ContractAddresses[idx], nil
391391
}
392392

393393
func queryWasmSmartContractState(endpoint, address, msg string) ([]byte, error) {

tests/e2e/scripts/hermes_bootstrap.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,4 @@ EOF
153153
# import keys
154154
hermes keys add --key-name rly01-gaia-b --chain $GAIA_B_E2E_CHAIN_ID --mnemonic-file /root/.hermes/GAIA_B_E2E_RLY_MNEMONIC.txt
155155
sleep 5
156-
hermes keys add --key-name rly01-gaia-a --chain $GAIA_A_E2E_CHAIN_ID --mnemonic-file /root/.hermes/GAIA_A_E2E_RLY_MNEMONIC.txt
156+
hermes keys add --key-name rly01-gaia-a --chain $GAIA_A_E2E_CHAIN_ID --mnemonic-file /root/.hermes/GAIA_A_E2E_RLY_MNEMONIC.txt

0 commit comments

Comments
 (0)