Skip to content

Commit

Permalink
init Test_SeqRotation_NoSeq_DA_EVM
Browse files Browse the repository at this point in the history
  • Loading branch information
anhductn2001 committed Aug 26, 2024
1 parent fc020a7 commit ed74ca6
Show file tree
Hide file tree
Showing 3 changed files with 313 additions and 6 deletions.
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,9 @@ e2e-test-fullnode-sync-block-sync-evm: clean-e2e
e2e-test-fullnode-disconnect-block-sync-evm: clean-e2e
cd tests && go test -timeout=30m -race -v -run TestSync_BlockSync_fn_disconnect_EVM .

e2e-test-sequencer-rotation-noseq-da-evm: clean-e2e
cd tests && go test -timeout=30m -race -v -run Test_SeqRotation_NoSeq_DA_EVM .

# Executes IBC tests via rollup-e2e-testing
e2e-test-ibc-success-wasm: clean-e2e
cd tests && go test -timeout=45m -race -v -run TestIBCTransferSuccess_Wasm .
Expand Down
300 changes: 300 additions & 0 deletions tests/sequencer_rotation_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,300 @@
package tests

import (
"context"
"fmt"
"testing"
"time"

transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zaptest"

test "github.com/decentrio/rollup-e2e-testing"
"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/ibc"
"github.com/decentrio/rollup-e2e-testing/relayer"
"github.com/decentrio/rollup-e2e-testing/testreporter"
"github.com/decentrio/rollup-e2e-testing/testutil"
)

func Test_SeqRotation_NoSeq_DA_EVM(t *testing.T) {
if testing.Short() {
t.Skip()
}

ctx := context.Background()

go StartDA()

// setup config for rollapp 1
settlement_layer_rollapp1 := "dymension"
settlement_node_address := fmt.Sprintf("http://dymension_100-1-val-0-%s:26657", t.Name())
rollapp1_id := "rollappevm_1234-1"
gas_price_rollapp1 := "0adym"
maxIdleTime1 := "5s"
maxProofTime := "500ms"
configFileOverrides := overridesDymintToml(settlement_layer_rollapp1, settlement_node_address, rollapp1_id, gas_price_rollapp1, maxIdleTime1, maxProofTime, "20s", false)

// Create chain factory with dymension
numHubVals := 1
numHubFullNodes := 1
numRollAppVals := 1
numRollAppFn := 0

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)

// Relayer Factory
client, network := test.DockerSetup(t)

// relayer for rollapp 1
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,
})

rep := testreporter.NewNopReporter()
eRep := rep.RelayerExecReporter(t)

err = ic.Build(ctx, eRep, test.InterchainBuildOptions{
TestName: t.Name(),
Client: client,
NetworkID: network,
SkipPathCreation: true,
}, nil, "", nil)
require.NoError(t, err)

// Check IBC Transfer before switch
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,
}

// Compose an IBC transfer and send from rollapp -> Hub
_, 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()

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)

// Unbond sequencer1
err = dymension.Unbond(ctx, rollapp1.GetSequencer(), rollapp1.GetSequencerKeyDir())
require.NoError(t, err)

seqAddr, err := dymension.AccountKeyBech32WithKeyDir(ctx, rollapp1.GetSequencer(), rollapp1.GetSequencerKeyDir())
require.NoError(t, err)

queryGetSequencerResponse, err := dymension.QueryShowSequencer(ctx, seqAddr)
require.NoError(t, err)
require.Equal(t, queryGetSequencerResponse.Sequencer.Status, "OPERATING_STATUS_UNBONDING")

err = testutil.WaitForBlocks(ctx, 10, dymension, rollapp1)
require.NoError(t, err)

time.Sleep(150 * time.Second)

// Chain halted
err = testutil.WaitForBlocks(ctx, 5, dymension, rollapp1)
require.Error(t, err)

lastBlock, err := rollapp1.Height(ctx)
require.NoError(t, err)

// create 1 more sequencer
_, _, err = rollapp1.GetNode().ExecInit(ctx, "sequencer1", "/var/cosmos-chain/sequencer1")
require.NoError(t, err)

cmd := append([]string{rollapp1.Validators[0].Chain.Config().Bin}, "dymint", "show-sequencer", "--home", "/var/cosmos-chain/sequencer1")
pub1, _, err := rollapp1.GetNode().Exec(ctx, cmd, nil)
require.NoError(t, err)

// Create some user accounts on both chains
users = test.GetAndFundTestUsers(t, ctx, t.Name(), walletAmount, dymension)

// Wait a few blocks for relayer to start and for user accounts to be created
err = testutil.WaitForBlocks(ctx, 5, dymension, rollapp1)
require.NoError(t, err)

sequencer1 := users[0]

command := []string{"dymd", "tx", "sequencer", "create-sequencer", string(pub1), rollapp1.Config().ChainID, rollapp1.GetSequencerKeyDir() + "/metadata_sequencer.json", "1000000000adym",
"--broadcast-mode", "async"}

_, err = dymension.Validators[0].ExecTx(ctx, sequencer1.KeyName(), command...)
require.NoError(t, err)

res, err := dymension.QueryShowSequencerByRollapp(ctx, rollapp1.Config().ChainID)
require.NoError(t, err)
require.Equal(t, len(res.Sequencers), 2, "should have 2 sequences")

afterBlock, err := rollapp1.Height(ctx)
require.NoError(t, err)
require.True(t, afterBlock > lastBlock)

// Compose an IBC transfer and send from rollapp -> Hub
_, err = rollapp1.SendIBCTransfer(ctx, channel.ChannelID, rollappUserAddr, transferData, ibc.TransferOptions{})
require.NoError(t, err)

// Check IBC after switch
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()

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)

}
16 changes: 10 additions & 6 deletions tests/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,12 @@ type ForwardMetadata struct {
}

const (
ibcPath = "dymension-demo"
anotherIbcPath = "dymension-demo2"
BLOCK_FINALITY_PERIOD = 30
EventDemandOrderCreated = "dymensionxyz.dymension.eibc.EventDemandOrderCreated"
EventDemandOrderFulfilled = "dymensionxyz.dymension.eibc.EventDemandOrderFulfilled"
EventDemandOrderFeeUpdated = "dymensionxyz.dymension.eibc.EventDemandOrderFeeUpdated"
ibcPath = "dymension-demo"
anotherIbcPath = "dymension-demo2"
BLOCK_FINALITY_PERIOD = 30
EventDemandOrderCreated = "dymensionxyz.dymension.eibc.EventDemandOrderCreated"
EventDemandOrderFulfilled = "dymensionxyz.dymension.eibc.EventDemandOrderFulfilled"
EventDemandOrderFeeUpdated = "dymensionxyz.dymension.eibc.EventDemandOrderFeeUpdated"
EventDemandOrderPacketStatusUpdated = "dymensionxyz.dymension.eibc.EventDemandOrderPacketStatusUpdated"
)

Expand Down Expand Up @@ -291,6 +291,10 @@ var (
}

dymensionGenesisKV = []cosmos.GenesisKV{
{
Key: "app_state.sequencer.params.notice_period",
Value: "180s",
},
// gov params
{
Key: "app_state.gov.params.voting_period",
Expand Down

0 comments on commit ed74ca6

Please sign in to comment.