-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
fc020a7
commit ed74ca6
Showing
3 changed files
with
313 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters