From 800fdaaa8921cac040eb603fbb7547d0a6c843d8 Mon Sep 17 00:00:00 2001 From: ThanhNhann Date: Fri, 2 Aug 2024 15:05:04 +0700 Subject: [PATCH 1/6] add test TestSequencerHubDisconnection_EVM --- Makefile | 3 + go.mod | 4 +- go.sum | 4 +- tests/sequencer_test.go | 380 ++++++++++++++++++++++++++++++++++++++++ tests/setup.go | 44 +++++ 5 files changed, 431 insertions(+), 4 deletions(-) create mode 100644 tests/sequencer_test.go diff --git a/Makefile b/Makefile index 363b926c..e58854ad 100644 --- a/Makefile +++ b/Makefile @@ -215,6 +215,9 @@ e2e-test-admc-metadata-not-found-evm: clean-e2e e2e-test-update-do-timeout-unallowed-evm: clean-e2e cd tests && go test -timeout=30m -race -v -run TestEIBCUpdateOnTimeout_Unallowed_EVM . +e2e-test-sequencer-hub-disconnection-evm: clean-e2e + cd tests && go test -timeout=30m -race -v -run TestSequencerHubDisconnection_EVM . + # Executes IBC tests via rollup-e2e-testing e2e-test-ibc-success-wasm: clean-e2e cd tests && go test -timeout=30m -race -v -run TestIBCTransferSuccess_Wasm . diff --git a/go.mod b/go.mod index 68ae669c..d9b99b03 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ replace ( require ( github.com/decentrio/e2e-testing-live v0.0.0-20240718080249-ee255229c869 - github.com/decentrio/rollup-e2e-testing v0.0.0-20240718115231-5ffec3805af4 + github.com/decentrio/rollup-e2e-testing v0.0.0-20240801122829-f7d18a2e3ed9 github.com/dymensionxyz/dymension/v3 v3.1.0-rc03.0.20240717194206-54c0fca5fada ) @@ -40,7 +40,7 @@ require ( github.com/cosmos/gogoproto v1.4.10 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set v1.8.0 // indirect - github.com/docker/docker v24.0.7+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible github.com/docker/go-connections v0.4.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect diff --git a/go.sum b/go.sum index de98de44..b9b0b4a0 100644 --- a/go.sum +++ b/go.sum @@ -384,8 +384,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decentrio/e2e-testing-live v0.0.0-20240718080249-ee255229c869 h1:qWpUYGOsrSC+1Vmd2TjhbsSpntvvx9PsX3AoeMunFxc= github.com/decentrio/e2e-testing-live v0.0.0-20240718080249-ee255229c869/go.mod h1:HZNYnPwmSxkwTPjSD5yolauc1Vx1ZzKL4FFMxTq4H5Y= -github.com/decentrio/rollup-e2e-testing v0.0.0-20240718115231-5ffec3805af4 h1:ZZFkAHWyK8KEF/tsyNIQ3xIhQHr2hAFyz0KE4iJM1q0= -github.com/decentrio/rollup-e2e-testing v0.0.0-20240718115231-5ffec3805af4/go.mod h1:NwTceYVxAaIZI65g/PdibVnGRMXuZzqzhDIkWsqJaQM= +github.com/decentrio/rollup-e2e-testing v0.0.0-20240801122829-f7d18a2e3ed9 h1:a7/91xjXcdsVaWZ66EKUA8GMjmvNIQQYtZdRsjfksco= +github.com/decentrio/rollup-e2e-testing v0.0.0-20240801122829-f7d18a2e3ed9/go.mod h1:NwTceYVxAaIZI65g/PdibVnGRMXuZzqzhDIkWsqJaQM= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= diff --git a/tests/sequencer_test.go b/tests/sequencer_test.go new file mode 100644 index 00000000..3e199ce1 --- /dev/null +++ b/tests/sequencer_test.go @@ -0,0 +1,380 @@ +package tests + +import ( + "bufio" + "context" + "fmt" + "os" + "strings" + "testing" + + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zaptest" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/strslice" + + test "github.com/decentrio/rollup-e2e-testing" + "github.com/decentrio/rollup-e2e-testing/cosmos/hub/celes_hub" + "github.com/decentrio/rollup-e2e-testing/cosmos/hub/dym_hub" + "github.com/decentrio/rollup-e2e-testing/cosmos/rollapp/dym_rollapp" + "github.com/decentrio/rollup-e2e-testing/relayer" + + "github.com/decentrio/rollup-e2e-testing/ibc" + "github.com/decentrio/rollup-e2e-testing/testreporter" + "github.com/decentrio/rollup-e2e-testing/testutil" +) + +func TestSequencerHubDisconnection_EVM(t *testing.T) { + if testing.Short() { + t.Skip() + } + + ctx := context.Background() + + // configFileOverrides := make(map[string]any) + dymintTomlOverrides := make(testutil.Toml) + dymintTomlOverrides["settlement_layer"] = "dymension" + dymintTomlOverrides["settlement_node_address"] = fmt.Sprintf("http://dymension_100-1-val-0-%s:26655", t.Name()) // Hub RPC not available + dymintTomlOverrides["rollapp_id"] = "rollappevm_1234-1" + dymintTomlOverrides["settlement_gas_prices"] = "0adym" + dymintTomlOverrides["max_idle_time"] = "3s" + dymintTomlOverrides["max_proof_time"] = "500ms" + dymintTomlOverrides["batch_submit_max_time"] = "80s" + + configFileOverrides1 := make(map[string]any) + configTomlOverrides1 := make(testutil.Toml) + configTomlOverrides1["timeout_commit"] = "2s" + configTomlOverrides1["timeout_propose"] = "2s" + configTomlOverrides1["index_all_keys"] = "true" + configTomlOverrides1["mode"] = "validator" + + configFileOverrides1["config/config.toml"] = configTomlOverrides1 + + // Create chain factory with dymension + numHubVals := 1 + numHubFullNodes := 1 + numRollAppFn := 0 + numRollAppVals := 1 + nodeStore := "/home/celestia/light" + p2pNetwork := "mocha-4" + coreIp := "celestia-testnet-consensus.itrocket.net" + trustedHash := "\"A62DD37EDF3DFF5A7383C6B5AA2AC619D1F8C8FEB7BA07730E50BBAAC8F2FF0C\"" + sampleFrom := 2395649 + + cf := test.NewBuiltinChainFactory(zaptest.NewLogger(t), []*test.ChainSpec{ + { + Name: "celes-hub", + ChainConfig: ibc.ChainConfig{ + Name: "celestia", + Denom: "utia", + Type: "hub-celes", + GasPrices: "0.002utia", + TrustingPeriod: "112h", + ChainID: "test", + Bin: "celestia-appd", + Images: []ibc.DockerImage{ + { + Repository: "ghcr.io/decentrio/light", + Version: "debug", + UidGid: "1025:1025", + }, + }, + Bech32Prefix: "celestia", + CoinType: "118", + GasAdjustment: 1.5, + ConfigFileOverrides: configFileOverrides1, + }, + NumValidators: &numHubVals, + NumFullNodes: &numRollAppFn, + }, + }) + + // Get chains from the chain factory + chains, err := cf.Chains(t.Name()) + require.NoError(t, err) + + celestia := chains[0].(*celes_hub.CelesHub) + + // Relayer Factory + client, network := test.DockerSetup(t) + + ic := test.NewSetup(). + AddChain(celestia) + + rep := testreporter.NewNopReporter() + eRep := rep.RelayerExecReporter(t) + + err = ic.Build(ctx, eRep, test.InterchainBuildOptions{ + TestName: t.Name(), + Client: client, + NetworkID: network, + SkipPathCreation: false, + + // This can be used to write to the block database which will index all block data e.g. txs, msgs, events, etc. + // BlockDatabaseFile: test.DefaultBlockDatabaseFilepath(), + }, nil, "", nil) + require.NoError(t, err) + + validator, err := celestia.GetNode().AccountKeyBech32(ctx, "validator") + require.NoError(t, err) + // Get fund for submit blob + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + GetFaucet("http://18.184.170.181:3000/api/get-tia", validator) + err = testutil.WaitForBlocks(ctx, 8, celestia) + require.NoError(t, err) + + err = celestia.GetNode().InitCelestiaDaLightNode(ctx, nodeStore, p2pNetwork, nil) + require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 3, celestia) + require.NoError(t, err) + + file, err := os.Open("/tmp/celestia/light/config.toml") + require.NoError(t, err) + defer file.Close() + + var lines []string + scanner := bufio.NewScanner(file) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + + for i, line := range lines { + if strings.HasPrefix(line, " TrustedHash =") { + lines[i] = fmt.Sprintf(" TrustedHash = %s", trustedHash) + } else if strings.HasPrefix(line, " SampleFrom =") { + lines[i] = fmt.Sprintf(" SampleFrom = %d", sampleFrom) + } else if strings.HasPrefix(line, " Address =") { + lines[i] = fmt.Sprintf(" Address = \"0.0.0.0\"") + } + } + + output := strings.Join(lines, "\n") + file, err = os.Create("/tmp/celestia/light/config.toml") + require.NoError(t, err) + defer file.Close() + + _, err = file.Write([]byte(output)) + require.NoError(t, err) + + containerID := fmt.Sprintf("test-val-0-%s", t.Name()) + + // Create an exec instance + execConfig := types.ExecConfig{ + Cmd: strslice.StrSlice([]string{"celestia", "light", "start", "--node.store", nodeStore, "--gateway", "--core.ip", coreIp, "--p2p.network", p2pNetwork, "--keyring.accname", "validator"}), // Replace with your command and arguments + } + + execIDResp, err := client.ContainerExecCreate(ctx, containerID, execConfig) + if err != nil { + panic(err) + } + + execID := execIDResp.ID + + // Start the exec instance + execStartCheck := types.ExecStartCheck{ + Tty: false, + } + + if err := client.ContainerExecStart(ctx, execID, execStartCheck); err != nil { + panic(err) + } + + // _ = celestia.GetNode().StartCelestiaDaLightNode(ctx, nodeStore, coreIp, p2pNetwork, nil) + // require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 10, celestia) + require.NoError(t, err) + + celestia_token, err := celestia.GetNode().GetAuthTokenCelestiaDaLight(ctx, p2pNetwork, nodeStore) + require.NoError(t, err) + println("check token: ", celestia_token) + celestia_namespace_id, err := RandomHex(10) + require.NoError(t, err) + println("check namespace: ", celestia_namespace_id) + da_config := fmt.Sprintf("{\"base_url\": \"http://test-val-0-%s:26658\", \"timeout\": 60000000000, \"gas_prices\":1.0, \"gas_adjustment\": 1.3, \"namespace_id\": \"%s\", \"auth_token\":\"%s\"}", t.Name(), celestia_namespace_id, celestia_token) + + configFileOverrides := make(map[string]any) + dymintTomlOverrides["da_layer"] = "celestia" + dymintTomlOverrides["namespace_id"] = celestia_namespace_id + dymintTomlOverrides["da_config"] = da_config + configFileOverrides["config/dymint.toml"] = dymintTomlOverrides + + cf = test.NewBuiltinChainFactory(zaptest.NewLogger(t), []*test.ChainSpec{ + { + Name: "rollapp1", + ChainConfig: ibc.ChainConfig{ + Type: "rollapp-dym", + Name: "rollapp-temp", + ChainID: "rollappevm_1234-1", + Images: []ibc.DockerImage{rollappEVMImage}, + Bin: "rollappd", + Bech32Prefix: "ethm", + Denom: "urax", + CoinType: "60", + GasPrices: "0.0urax", + GasAdjustment: 1.1, + TrustingPeriod: "112h", + EncodingConfig: encodingConfig(), + NoHostMount: false, + ModifyGenesis: modifyRollappEVMGenesis(rollappEVMGenesisKV), + ConfigFileOverrides: configFileOverrides, + }, + NumValidators: &numRollAppVals, + NumFullNodes: &numRollAppFn, + }, + { + Name: "dymension-hub", + ChainConfig: dymensionConfig, + NumValidators: &numHubVals, + NumFullNodes: &numHubFullNodes, + }, + }) + + // Get chains from the chain factory + chains, err = cf.Chains(t.Name()) + require.NoError(t, err) + + rollapp1 := chains[0].(*dym_rollapp.DymRollApp) + dymension := chains[1].(*dym_hub.DymHub) + + r := test.NewBuiltinRelayerFactory(ibc.CosmosRly, zaptest.NewLogger(t), + relayer.CustomDockerImage(RelayerMainRepo, relayerVersion, "100:1000"), relayer.ImagePull(pullRelayerImage), + ).Build(t, client, "relayer", network) + + ic = test.NewSetup(). + AddRollUp(dymension, rollapp1). + AddRelayer(r, "relayer"). + AddLink(test.InterchainLink{ + Chain1: dymension, + Chain2: rollapp1, + Relayer: r, + Path: ibcPath, + }) + + err = ic.Build(ctx, eRep, test.InterchainBuildOptions{ + TestName: t.Name(), + Client: client, + NetworkID: network, + SkipPathCreation: true, + + // This can be used to write to the block database which will index all block data e.g. txs, msgs, events, etc. + // BlockDatabaseFile: test.DefaultBlockDatabaseFilepath(), + }, nil, "", nil) + require.NoError(t, err) + + CreateChannel(ctx, t, r, eRep, dymension.CosmosChain, rollapp1.CosmosChain, ibcPath) + + // Create some user accounts on both chains + users := test.GetAndFundTestUsers(t, ctx, t.Name(), walletAmount, dymension, rollapp1) + + // Get our Bech32 encoded user addresses + dymensionUser, rollappUser := users[0], users[1] + + dymensionUserAddr := dymensionUser.FormattedAddress() + rollappUserAddr := rollappUser.FormattedAddress() + + channel, err := ibc.GetTransferChannel(ctx, r, eRep, dymension.Config().ChainID, rollapp1.Config().ChainID) + require.NoError(t, err) + + err = r.StartRelayer(ctx, eRep, ibcPath) + require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 10, dymension, rollapp1) + require.NoError(t, err) + + // Send a normal ibc tx from RA -> Hub + transferData := ibc.WalletData{ + Address: dymensionUserAddr, + Denom: rollapp1.Config().Denom, + Amount: transferAmount, + } + _, err = rollapp1.SendIBCTransfer(ctx, channel.ChannelID, rollappUserAddr, transferData, ibc.TransferOptions{}) + require.NoError(t, err) + + rollappHeight, err := rollapp1.GetNode().Height(ctx) + require.NoError(t, err) + + // Assert balance was updated on the hub + testutil.AssertBalance(t, ctx, rollapp1, rollappUserAddr, rollapp1.Config().Denom, walletAmount.Sub(transferData.Amount)) + + // wait until the packet is finalized + isFinalized, err := dymension.WaitUntilRollappHeightIsFinalized(ctx, rollapp1.GetChainID(), rollappHeight, 300) + require.NoError(t, err) + require.True(t, isFinalized) + + // Get the IBC denom for urax on Hub + rollappTokenDenom := transfertypes.GetPrefixedDenom(channel.Counterparty.PortID, channel.Counterparty.ChannelID, rollapp1.Config().Denom) + rollappIBCDenom := transfertypes.ParseDenomTrace(rollappTokenDenom).IBCDenom() + + // Minus 0.1% of transfer amount for bridge fee + testutil.AssertBalance(t, ctx, dymension, dymensionUserAddr, rollappIBCDenom, transferAmount.Sub(bridgingFee)) + + // Get original account balances + dymensionOrigBal, err := dymension.GetBalance(ctx, dymensionUserAddr, dymension.Config().Denom) + require.NoError(t, err) + + // Compose an IBC transfer and send from dymension -> rollapp + transferData = ibc.WalletData{ + Address: rollappUserAddr, + Denom: dymension.Config().Denom, + Amount: transferAmount, + } + + // Compose an IBC transfer and send from Hub -> rollapp + _, err = dymension.SendIBCTransfer(ctx, channel.ChannelID, dymensionUserAddr, transferData, ibc.TransferOptions{}) + require.NoError(t, err) + + // Assert balance was updated on the hub + testutil.AssertBalance(t, ctx, dymension, dymensionUserAddr, dymension.Config().Denom, dymensionOrigBal.Sub(transferData.Amount)) + + err = testutil.WaitForBlocks(ctx, 10, dymension, rollapp1) + require.NoError(t, err) + + // Get the IBC denom + dymensionTokenDenom := transfertypes.GetPrefixedDenom(channel.Counterparty.PortID, channel.Counterparty.ChannelID, dymension.Config().Denom) + dymensionIBCDenom := transfertypes.ParseDenomTrace(dymensionTokenDenom).IBCDenom() + + testutil.AssertBalance(t, ctx, dymension, dymensionUserAddr, dymension.Config().Denom, dymensionOrigBal.Sub(transferData.Amount)) + erc20MAcc, err := rollapp1.Validators[0].QueryModuleAccount(ctx, "erc20") + require.NoError(t, err) + erc20MAccAddr := erc20MAcc.Account.BaseAccount.Address + testutil.AssertBalance(t, ctx, rollapp1, erc20MAccAddr, dymensionIBCDenom, transferData.Amount) +} diff --git a/tests/setup.go b/tests/setup.go index 6777baa0..73f30055 100644 --- a/tests/setup.go +++ b/tests/setup.go @@ -1,9 +1,12 @@ package tests import ( + "bytes" "context" "encoding/json" "fmt" + "io" + "net/http" "os" "testing" "time" @@ -657,3 +660,44 @@ func RandomHex(numberOfBytes int) (string, error) { return hexString, nil } + +func GetFaucet(api, address string) { + // Data to send in the POST request + data := map[string]string{ + "address": address, + } + jsonData, err := json.Marshal(data) + if err != nil { + fmt.Println("Error marshalling JSON:", err) + return + } + + // Create a new POST request + req, err := http.NewRequest("POST", api, bytes.NewBuffer(jsonData)) + if err != nil { + fmt.Println("Error creating request:", err) + return + } + + // Set the request header to indicate that we're sending JSON data + req.Header.Set("Content-Type", "application/json") + + // Create an HTTP client and send the request + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + fmt.Println("Error sending request:", err) + return + } + defer resp.Body.Close() + + // Read the response + body, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println("Error reading response body:", err) + return + } + + fmt.Println("Response Status:", resp.Status) + fmt.Println("Response Body:", string(body)) +} From f4dac03624dc906e4f08fa2e1dc54df8338597ba Mon Sep 17 00:00:00 2001 From: anhductn2001 Date: Tue, 6 Aug 2024 13:56:27 +0700 Subject: [PATCH 2/6] stop hub --- tests/sequencer_test.go | 84 ++++++----------------------------------- 1 file changed, 11 insertions(+), 73 deletions(-) diff --git a/tests/sequencer_test.go b/tests/sequencer_test.go index 3e199ce1..694f0478 100644 --- a/tests/sequencer_test.go +++ b/tests/sequencer_test.go @@ -8,7 +8,6 @@ import ( "strings" "testing" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" @@ -36,7 +35,7 @@ func TestSequencerHubDisconnection_EVM(t *testing.T) { // configFileOverrides := make(map[string]any) dymintTomlOverrides := make(testutil.Toml) dymintTomlOverrides["settlement_layer"] = "dymension" - dymintTomlOverrides["settlement_node_address"] = fmt.Sprintf("http://dymension_100-1-val-0-%s:26655", t.Name()) // Hub RPC not available + dymintTomlOverrides["settlement_node_address"] = fmt.Sprintf("http://dymension_100-1-val-0-%s:26657", t.Name()) // Hub RPC not available dymintTomlOverrides["rollapp_id"] = "rollappevm_1234-1" dymintTomlOverrides["settlement_gas_prices"] = "0adym" dymintTomlOverrides["max_idle_time"] = "3s" @@ -60,8 +59,8 @@ func TestSequencerHubDisconnection_EVM(t *testing.T) { nodeStore := "/home/celestia/light" p2pNetwork := "mocha-4" coreIp := "celestia-testnet-consensus.itrocket.net" - trustedHash := "\"A62DD37EDF3DFF5A7383C6B5AA2AC619D1F8C8FEB7BA07730E50BBAAC8F2FF0C\"" - sampleFrom := 2395649 + trustedHash := "\"13F87599EA6F3F0C767E395AF6F565EDA9A219FB0BC54221B0F09E7B09BEB54E\"" + sampleFrom := 2424141 cf := test.NewBuiltinChainFactory(zaptest.NewLogger(t), []*test.ChainSpec{ { @@ -300,81 +299,20 @@ func TestSequencerHubDisconnection_EVM(t *testing.T) { }, nil, "", nil) require.NoError(t, err) - CreateChannel(ctx, t, r, eRep, dymension.CosmosChain, rollapp1.CosmosChain, ibcPath) - - // Create some user accounts on both chains - users := test.GetAndFundTestUsers(t, ctx, t.Name(), walletAmount, dymension, rollapp1) - - // Get our Bech32 encoded user addresses - dymensionUser, rollappUser := users[0], users[1] - - dymensionUserAddr := dymensionUser.FormattedAddress() - rollappUserAddr := rollappUser.FormattedAddress() - - channel, err := ibc.GetTransferChannel(ctx, r, eRep, dymension.Config().ChainID, rollapp1.Config().ChainID) - require.NoError(t, err) - - err = r.StartRelayer(ctx, eRep, ibcPath) - require.NoError(t, err) - - err = testutil.WaitForBlocks(ctx, 10, dymension, rollapp1) - require.NoError(t, err) - - // Send a normal ibc tx from RA -> Hub - transferData := ibc.WalletData{ - Address: dymensionUserAddr, - Denom: rollapp1.Config().Denom, - Amount: transferAmount, - } - _, err = rollapp1.SendIBCTransfer(ctx, channel.ChannelID, rollappUserAddr, transferData, ibc.TransferOptions{}) - require.NoError(t, err) + dymension.StopAllNodes(ctx) rollappHeight, err := rollapp1.GetNode().Height(ctx) require.NoError(t, err) - // Assert balance was updated on the hub - testutil.AssertBalance(t, ctx, rollapp1, rollappUserAddr, rollapp1.Config().Denom, walletAmount.Sub(transferData.Amount)) - // wait until the packet is finalized - isFinalized, err := dymension.WaitUntilRollappHeightIsFinalized(ctx, rollapp1.GetChainID(), rollappHeight, 300) - require.NoError(t, err) - require.True(t, isFinalized) - - // Get the IBC denom for urax on Hub - rollappTokenDenom := transfertypes.GetPrefixedDenom(channel.Counterparty.PortID, channel.Counterparty.ChannelID, rollapp1.Config().Denom) - rollappIBCDenom := transfertypes.ParseDenomTrace(rollappTokenDenom).IBCDenom() - - // Minus 0.1% of transfer amount for bridge fee - testutil.AssertBalance(t, ctx, dymension, dymensionUserAddr, rollappIBCDenom, transferAmount.Sub(bridgingFee)) - - // Get original account balances - dymensionOrigBal, err := dymension.GetBalance(ctx, dymensionUserAddr, dymension.Config().Denom) - require.NoError(t, err) - - // Compose an IBC transfer and send from dymension -> rollapp - transferData = ibc.WalletData{ - Address: rollappUserAddr, - Denom: dymension.Config().Denom, - Amount: transferAmount, - } + isFinalized, err := dymension.WaitUntilRollappHeightIsFinalized(ctx, rollapp1.GetChainID(), rollappHeight, 180) + require.Error(t, err) + require.False(t, isFinalized) - // Compose an IBC transfer and send from Hub -> rollapp - _, err = dymension.SendIBCTransfer(ctx, channel.ChannelID, dymensionUserAddr, transferData, ibc.TransferOptions{}) - require.NoError(t, err) - - // Assert balance was updated on the hub - testutil.AssertBalance(t, ctx, dymension, dymensionUserAddr, dymension.Config().Denom, dymensionOrigBal.Sub(transferData.Amount)) - - err = testutil.WaitForBlocks(ctx, 10, dymension, rollapp1) - require.NoError(t, err) + dymension.StartAllNodes(ctx) - // Get the IBC denom - dymensionTokenDenom := transfertypes.GetPrefixedDenom(channel.Counterparty.PortID, channel.Counterparty.ChannelID, dymension.Config().Denom) - dymensionIBCDenom := transfertypes.ParseDenomTrace(dymensionTokenDenom).IBCDenom() - - testutil.AssertBalance(t, ctx, dymension, dymensionUserAddr, dymension.Config().Denom, dymensionOrigBal.Sub(transferData.Amount)) - erc20MAcc, err := rollapp1.Validators[0].QueryModuleAccount(ctx, "erc20") + // wait until the packet is finalized + isFinalized, err = dymension.WaitUntilRollappHeightIsFinalized(ctx, rollapp1.GetChainID(), rollappHeight, 300) require.NoError(t, err) - erc20MAccAddr := erc20MAcc.Account.BaseAccount.Address - testutil.AssertBalance(t, ctx, rollapp1, erc20MAccAddr, dymensionIBCDenom, transferData.Amount) + require.True(t, isFinalized) } From 610140e68401f1ddf64adf754aa46a1175ac96ae Mon Sep 17 00:00:00 2001 From: anhductn2001 Date: Tue, 6 Aug 2024 13:58:09 +0700 Subject: [PATCH 3/6] latest --- tests/sequencer_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sequencer_test.go b/tests/sequencer_test.go index 694f0478..f227eb6a 100644 --- a/tests/sequencer_test.go +++ b/tests/sequencer_test.go @@ -76,7 +76,7 @@ func TestSequencerHubDisconnection_EVM(t *testing.T) { Images: []ibc.DockerImage{ { Repository: "ghcr.io/decentrio/light", - Version: "debug", + Version: "latest", UidGid: "1025:1025", }, }, From 32af0393b9a215b0895d695a6fecdcedd78a9c18 Mon Sep 17 00:00:00 2001 From: ThanhNhann Date: Tue, 6 Aug 2024 16:56:04 +0700 Subject: [PATCH 4/6] update get height and hash --- go.mod | 2 +- go.sum | 4 ++-- tests/sequencer_test.go | 26 ++++++++++++++++++++++---- tests/setup.go | 23 +++++++++++++++++++++++ 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 08a5037c..0175f879 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ replace ( require ( github.com/decentrio/e2e-testing-live v0.0.0-20240718080249-ee255229c869 - github.com/decentrio/rollup-e2e-testing v0.0.0-20240806030541-f481a432d835 + github.com/decentrio/rollup-e2e-testing v0.0.0-20240806080552-26b29256328c github.com/dymensionxyz/dymension/v3 v3.1.0-rc03.0.20240717194206-54c0fca5fada ) diff --git a/go.sum b/go.sum index a7de8f90..0ee1d797 100644 --- a/go.sum +++ b/go.sum @@ -384,8 +384,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decentrio/e2e-testing-live v0.0.0-20240718080249-ee255229c869 h1:qWpUYGOsrSC+1Vmd2TjhbsSpntvvx9PsX3AoeMunFxc= github.com/decentrio/e2e-testing-live v0.0.0-20240718080249-ee255229c869/go.mod h1:HZNYnPwmSxkwTPjSD5yolauc1Vx1ZzKL4FFMxTq4H5Y= -github.com/decentrio/rollup-e2e-testing v0.0.0-20240806030541-f481a432d835 h1:d5Cng+mvkeee1AN7T0vBiTL+NzkPHe8/p4tffw8CmrY= -github.com/decentrio/rollup-e2e-testing v0.0.0-20240806030541-f481a432d835/go.mod h1:QmBrZgZplhtgHRWC0Z7LC7TDsKuC8sDyQvZyXXaqw/c= +github.com/decentrio/rollup-e2e-testing v0.0.0-20240806080552-26b29256328c h1:Z2og4UaUH558Hth3A2t/NOH4zR0dMAE8/Sxy1V4IxhU= +github.com/decentrio/rollup-e2e-testing v0.0.0-20240806080552-26b29256328c/go.mod h1:QmBrZgZplhtgHRWC0Z7LC7TDsKuC8sDyQvZyXXaqw/c= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= diff --git a/tests/sequencer_test.go b/tests/sequencer_test.go index f227eb6a..8a24d384 100644 --- a/tests/sequencer_test.go +++ b/tests/sequencer_test.go @@ -7,6 +7,7 @@ import ( "os" "strings" "testing" + "strconv" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" @@ -59,8 +60,13 @@ func TestSequencerHubDisconnection_EVM(t *testing.T) { nodeStore := "/home/celestia/light" p2pNetwork := "mocha-4" coreIp := "celestia-testnet-consensus.itrocket.net" - trustedHash := "\"13F87599EA6F3F0C767E395AF6F565EDA9A219FB0BC54221B0F09E7B09BEB54E\"" - sampleFrom := 2424141 + // trustedHash := "\"017428B113893E854767E626BC9CF860BDF49C2AC2DF56F3C1B6582B2597AC6E\"" + // sampleFrom := 2423882 + + url := "https://api-mocha.celenium.io/v1/block/count" + headerKey := "User-Agent" + headerValue := "Apidog/1.0.0 (https://apidog.com)" + rpcEndpoint := "http://celestia-testnet-consensus.itrocket.net:26657" cf := test.NewBuiltinChainFactory(zaptest.NewLogger(t), []*test.ChainSpec{ { @@ -169,6 +175,18 @@ func TestSequencerHubDisconnection_EVM(t *testing.T) { require.NoError(t, err) defer file.Close() + lastestBlockHeight, err := GetLatestBlockHeight(url, headerKey, headerValue) + require.NoError(t, err) + lastestBlockHeight = strings.TrimRight(lastestBlockHeight, "\n") + heightOfBlock, err := strconv.ParseInt(lastestBlockHeight, 10, 64) // base 10, bit size 64 + require.NoError(t, err) + + hash, err := celestia.GetNode().GetHashOfBlockHeightWithCustomizeRpcEndpoint(ctx, fmt.Sprintf("%d", heightOfBlock-2), rpcEndpoint) + require.NoError(t, err) + + fmt.Println(hash) + + hash = strings.TrimRight(hash, "\n") var lines []string scanner := bufio.NewScanner(file) for scanner.Scan() { @@ -177,9 +195,9 @@ func TestSequencerHubDisconnection_EVM(t *testing.T) { for i, line := range lines { if strings.HasPrefix(line, " TrustedHash =") { - lines[i] = fmt.Sprintf(" TrustedHash = %s", trustedHash) + lines[i] = fmt.Sprintf(" TrustedHash = \"%s\"", hash) } else if strings.HasPrefix(line, " SampleFrom =") { - lines[i] = fmt.Sprintf(" SampleFrom = %d", sampleFrom) + lines[i] = fmt.Sprintf(" SampleFrom = %d", heightOfBlock) } else if strings.HasPrefix(line, " Address =") { lines[i] = fmt.Sprintf(" Address = \"0.0.0.0\"") } diff --git a/tests/setup.go b/tests/setup.go index 91f063bd..69cf9c2d 100644 --- a/tests/setup.go +++ b/tests/setup.go @@ -704,3 +704,26 @@ func GetFaucet(api, address string) { fmt.Println("Response Status:", resp.Status) fmt.Println("Response Body:", string(body)) } + +func GetLatestBlockHeight(url, headerKey, headerValue string) (string, error) { + client := &http.Client{} + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return "", err + } + + req.Header.Add(headerKey, headerValue) + res, err := client.Do(req) + if err != nil { + return "", err + } + + defer res.Body.Close() + + body, err := io.ReadAll(res.Body) + if err != nil { + return "", err + } + + return string(body), nil +} From 184ffb4824b3ebb2023de7c4d512c562d909ba79 Mon Sep 17 00:00:00 2001 From: anhductn2001 Date: Wed, 7 Aug 2024 10:48:14 +0700 Subject: [PATCH 5/6] minor --- tests/sequencer_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/sequencer_test.go b/tests/sequencer_test.go index 8a24d384..7e787c84 100644 --- a/tests/sequencer_test.go +++ b/tests/sequencer_test.go @@ -5,9 +5,9 @@ import ( "context" "fmt" "os" + "strconv" "strings" "testing" - "strconv" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" @@ -197,7 +197,7 @@ func TestSequencerHubDisconnection_EVM(t *testing.T) { if strings.HasPrefix(line, " TrustedHash =") { lines[i] = fmt.Sprintf(" TrustedHash = \"%s\"", hash) } else if strings.HasPrefix(line, " SampleFrom =") { - lines[i] = fmt.Sprintf(" SampleFrom = %d", heightOfBlock) + lines[i] = fmt.Sprintf(" SampleFrom = %d", heightOfBlock-2) } else if strings.HasPrefix(line, " Address =") { lines[i] = fmt.Sprintf(" Address = \"0.0.0.0\"") } From e2fc612132273b9b7a5246a3c7c6843b8a78291a Mon Sep 17 00:00:00 2001 From: anhductn2001 Date: Thu, 8 Aug 2024 10:43:10 +0700 Subject: [PATCH 6/6] chmod --- tests/sequencer_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/sequencer_test.go b/tests/sequencer_test.go index 7e787c84..44a58568 100644 --- a/tests/sequencer_test.go +++ b/tests/sequencer_test.go @@ -171,6 +171,12 @@ func TestSequencerHubDisconnection_EVM(t *testing.T) { err = testutil.WaitForBlocks(ctx, 3, celestia) require.NoError(t, err) + // Change the file permissions + command := []string{"chmod", "-R", "777", "/home/celestia/light/config.toml"} + + _, _, err = celestia.Exec(ctx, command, nil) + require.NoError(t, err) + file, err := os.Open("/tmp/celestia/light/config.toml") require.NoError(t, err) defer file.Close()