From 829ed5d842d01b06c4c9191f8e31c3119bea7865 Mon Sep 17 00:00:00 2001 From: Sai Kumar Date: Wed, 17 May 2023 00:11:55 +0530 Subject: [PATCH 1/2] refactor the e2e setup suite --- tests/e2e/e2e_ibc_test.go | 67 +-- tests/e2e/e2e_test.go | 44 +- tests/e2e/eth_abi.go | 33 -- tests/e2e/{ => setup}/chain.go | 26 +- tests/e2e/setup/eth_abi.go | 33 ++ tests/e2e/{ => setup}/ethereum.go | 2 +- tests/e2e/{ => setup}/gaia.go | 2 +- tests/e2e/{ => setup}/genesis.go | 10 +- tests/e2e/{ => setup}/io.go | 2 +- tests/e2e/{ => setup}/keys.go | 27 +- tests/e2e/{ => setup}/orchestrator.go | 32 +- .../e2e/{e2e_setup_test.go => setup/setup.go} | 404 +++++++++--------- .../e2e/{e2e_util_test.go => setup/utils.go} | 260 ++++++----- tests/e2e/{ => setup}/validator.go | 20 +- tests/e2e/util.go | 45 -- 15 files changed, 505 insertions(+), 502 deletions(-) delete mode 100644 tests/e2e/eth_abi.go rename tests/e2e/{ => setup}/chain.go (85%) create mode 100644 tests/e2e/setup/eth_abi.go rename tests/e2e/{ => setup}/ethereum.go (97%) rename tests/e2e/{ => setup}/gaia.go (93%) rename tests/e2e/{ => setup}/genesis.go (91%) rename tests/e2e/{ => setup}/io.go (97%) rename tests/e2e/{ => setup}/keys.go (61%) rename tests/e2e/{ => setup}/orchestrator.go (80%) rename tests/e2e/{e2e_setup_test.go => setup/setup.go} (71%) rename tests/e2e/{e2e_util_test.go => setup/utils.go} (66%) rename tests/e2e/{ => setup}/validator.go (96%) delete mode 100644 tests/e2e/util.go diff --git a/tests/e2e/e2e_ibc_test.go b/tests/e2e/e2e_ibc_test.go index 80d3986c82..5a4cfbea1f 100644 --- a/tests/e2e/e2e_ibc_test.go +++ b/tests/e2e/e2e_ibc_test.go @@ -7,15 +7,16 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" appparams "github.com/umee-network/umee/v4/app/params" + setup "github.com/umee-network/umee/v4/tests/e2e/setup" "github.com/umee-network/umee/v4/tests/grpc" "github.com/umee-network/umee/v4/x/uibc" ) var powerReduction = sdk.MustNewDecFromStr("10").Power(6) -func (s *IntegrationTestSuite) checkOutflowByPercentage(endpoint, excDenom string, outflow, amount, perDiff sdk.Dec) { +func (s *E2ETest) checkOutflowByPercentage(endpoint, excDenom string, outflow, amount, perDiff sdk.Dec) { // get historic average price for denom (SYMBOL_DENOM) - histoAvgPrice, err := queryHistAvgPrice(endpoint, excDenom) + histoAvgPrice, err := s.QueryHistAvgPrice(endpoint, excDenom) s.Require().NoError(err) totalPrice := amount.Quo(powerReduction).Mul(histoAvgPrice) s.T().Log("exchangeRate total price ", totalPrice.String(), "outflow value", outflow.String()) @@ -25,10 +26,10 @@ func (s *IntegrationTestSuite) checkOutflowByPercentage(endpoint, excDenom strin s.Require().True(outflow.GTE(totalPrice.Sub(percentageDiff)) || totalPrice.GTE(outflow.Sub(percentageDiff))) } -func (s *IntegrationTestSuite) checkOutflows(umeeAPIEndpoint, denom string, checkWithExcRate bool, amount sdk.Dec, excDenom string) { +func (s *E2ETest) checkOutflows(umeeAPIEndpoint, denom string, checkWithExcRate bool, amount sdk.Dec, excDenom string) { s.Require().Eventually( func() bool { - a, err := queryOutflows(umeeAPIEndpoint, denom) + a, err := s.QueryOutflows(umeeAPIEndpoint, denom) s.Require().NoError(err) if checkWithExcRate { s.checkOutflowByPercentage(umeeAPIEndpoint, excDenom, a, amount, sdk.MustNewDecFromStr("0.01")) @@ -40,10 +41,10 @@ func (s *IntegrationTestSuite) checkOutflows(umeeAPIEndpoint, denom string, chec ) } -func (s *IntegrationTestSuite) checkSupply(endpoint, ibcDenom string, amount math.Int) { +func (s *E2ETest) checkSupply(endpoint, ibcDenom string, amount math.Int) { s.Require().Eventually( func() bool { - supply, err := queryTotalSupply(endpoint) + supply, err := s.QueryTotalSupply(endpoint) s.Require().NoError(err) s.Require().Equal(supply.AmountOf(ibcDenom).Int64(), amount.Int64()) return supply.AmountOf(ibcDenom).Equal(amount) @@ -53,14 +54,14 @@ func (s *IntegrationTestSuite) checkSupply(endpoint, ibcDenom string, amount mat ) } -func (s *IntegrationTestSuite) TestIBCTokenTransfer() { +func (s *E2ETest) TestIBCTokenTransfer() { // s.T().Parallel() var ibcStakeDenom string s.Run("ibc_transfer_quota", func() { // require the recipient account receives the IBC tokens (IBC packets ACKd) - gaiaAPIEndpoint := s.gaiaREST() - umeeAPIEndpoint := s.umeeREST() + gaiaAPIEndpoint := s.GaiaREST() + umeeAPIEndpoint := s.UmeeREST() atomSymbol := "ATOM" umeeSymbol := "UMEE" totalQuota := math.NewInt(120) @@ -72,23 +73,23 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { // send uatom from gaia to umee // Note : gaia -> umee (ibc_quota will not check token limit) - atomPrice, err := queryHistAvgPrice(umeeAPIEndpoint, atomSymbol) + atomPrice, err := s.QueryHistAvgPrice(umeeAPIEndpoint, atomSymbol) s.Require().NoError(err) emOfAtom := sdk.NewDecFromInt(totalQuota).Quo(atomPrice) c := sdk.NewInt64Coin("uatom", emOfAtom.Mul(powerReduction).RoundInt64()) s.Require().True(atomPrice.GT(sdk.OneDec()), "price should be non zero, and expecting higher than 1, got: %s", atomPrice) s.Require().True(c.Amount.GT(sdk.NewInt(2_000_000)), "amount should be non zero, and expecting much higher than 2 atom = 2e6 uatom, got: %s", c.Amount) - s.sendIBC(gaiaChainID, s.chain.id, "", c) + s.SendIBC(setup.GaiaChainID, s.Chain.ID, "", c) s.checkSupply(umeeAPIEndpoint, uatomIBCHash, c.Amount) // sending more tokens than token_quota limit of umee (token_quota is 100$) - histoAvgPriceOfUmee, err := queryHistAvgPrice(umeeAPIEndpoint, umeeSymbol) + histoAvgPriceOfUmee, err := s.QueryHistAvgPrice(umeeAPIEndpoint, umeeSymbol) s.Require().NoError(err) exceedAmountOfUmee := sdk.NewDecFromInt(totalQuota).Quo(histoAvgPriceOfUmee) s.T().Logf("sending %s amount %s more than %s", umeeSymbol, exceedAmountOfUmee.String(), totalQuota.String()) exceedAmountCoin := sdk.NewInt64Coin(appparams.BondDenom, exceedAmountOfUmee.Mul(powerReduction).RoundInt64()) - s.sendIBC(s.chain.id, gaiaChainID, "", exceedAmountCoin) + s.SendIBC(s.Chain.ID, setup.GaiaChainID, "", exceedAmountCoin) // check the ibc (umee) quota after ibc txs s.checkSupply(gaiaAPIEndpoint, umeeIBCHash, math.ZeroInt()) @@ -99,14 +100,14 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { belowTokenQuota := sdk.NewDecFromInt(umeeInitialQuota).Quo(histoAvgPriceOfUmee) s.T().Logf("sending %s amount %s less than token quota %s", "UMEE", belowTokenQuota.String(), tokenQuota.String()) token := sdk.NewInt64Coin(appparams.BondDenom, belowTokenQuota.Mul(powerReduction).RoundInt64()) - s.sendIBC(s.chain.id, gaiaChainID, "", token) + s.SendIBC(s.Chain.ID, setup.GaiaChainID, "", token) s.checkOutflows(umeeAPIEndpoint, appparams.BondDenom, true, sdk.NewDecFromInt(token.Amount), appparams.Name) s.checkSupply(gaiaAPIEndpoint, umeeIBCHash, token.Amount) // send uatom (ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2) from umee to gaia uatomIBCToken := sdk.NewInt64Coin(uatomIBCHash, c.Amount.Int64()) // supply will be not be decreased because sending uatomIBCToken amount is more than token quota so it will fail - s.sendIBC(s.chain.id, gaiaChainID, "", uatomIBCToken) + s.SendIBC(s.Chain.ID, setup.GaiaChainID, "", uatomIBCToken) s.checkSupply(umeeAPIEndpoint, uatomIBCHash, uatomIBCToken.Amount) // send uatom below the token quota @@ -117,37 +118,37 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { */ belowTokenQuotabutNotBelowTotalQuota := sdk.NewDecFromInt(math.NewInt(90)).Quo(atomPrice) uatomIBCToken.Amount = math.NewInt(belowTokenQuotabutNotBelowTotalQuota.Mul(powerReduction).RoundInt64()) - s.sendIBC(s.chain.id, gaiaChainID, "", uatomIBCToken) + s.SendIBC(s.Chain.ID, setup.GaiaChainID, "", uatomIBCToken) // supply will be not be decreased because sending more than total quota from umee to gaia s.checkSupply(umeeAPIEndpoint, uatomIBCHash, c.Amount) // making sure below the total quota belowTokenQuotaInUSD := totalQuota.Sub(umeeInitialQuota).Sub(math.NewInt(2)) belowTokenQuotaforAtom := sdk.NewDecFromInt(belowTokenQuotaInUSD).Quo(atomPrice) uatomIBCToken.Amount = math.NewInt(belowTokenQuotaforAtom.Mul(powerReduction).RoundInt64()) - s.sendIBC(s.chain.id, gaiaChainID, "", uatomIBCToken) + s.SendIBC(s.Chain.ID, setup.GaiaChainID, "", uatomIBCToken) // remaing supply still exists for uatom in umee s.checkSupply(umeeAPIEndpoint, uatomIBCHash, c.Amount.Sub(uatomIBCToken.Amount)) s.checkOutflows(umeeAPIEndpoint, uatomIBCHash, true, sdk.NewDecFromInt(uatomIBCToken.Amount), atomSymbol) // sending more tokens then token_quota limit of umee - s.sendIBC(s.chain.id, gaiaChainID, "", exceedAmountCoin) + s.SendIBC(s.Chain.ID, setup.GaiaChainID, "", exceedAmountCoin) // check the ibc (umee) supply after ibc txs, it will same as previous because it will fail because to quota limit exceed s.checkSupply(gaiaAPIEndpoint, umeeIBCHash, token.Amount) /* sending back some amount from receiver to sender (ibc/XXX) gaia -> umee */ - s.sendIBC(gaiaChainID, s.chain.id, "", sdk.NewInt64Coin(umeeIBCHash, 1000)) + s.SendIBC(setup.GaiaChainID, s.Chain.ID, "", sdk.NewInt64Coin(umeeIBCHash, 1000)) s.checkSupply(gaiaAPIEndpoint, umeeIBCHash, token.Amount.Sub(math.NewInt(1000))) // sending back remaining ibc amount from receiver to sender (ibc/XXX) - s.sendIBC(gaiaChainID, s.chain.id, "", sdk.NewInt64Coin(umeeIBCHash, token.Amount.Sub(math.NewInt(1000)).Int64())) + s.SendIBC(setup.GaiaChainID, s.Chain.ID, "", sdk.NewInt64Coin(umeeIBCHash, token.Amount.Sub(math.NewInt(1000)).Int64())) s.checkSupply(gaiaAPIEndpoint, umeeIBCHash, math.ZeroInt()) // reset the outflows s.T().Logf("waiting until quota reset, basically it will take around 300 seconds to do quota reset") s.Require().Eventually( func() bool { - amount, err := queryOutflows(umeeAPIEndpoint, appparams.BondDenom) + amount, err := s.QueryOutflows(umeeAPIEndpoint, appparams.BondDenom) s.Require().NoError(err) if amount.IsZero() { s.T().Logf("quota is reset : %s is 0", appparams.BondDenom) @@ -165,22 +166,22 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { ***/ // Make gov proposal to disable the quota check on ibc-transfer err = grpc.UIBCIBCTransferSatusUpdate( - s.umee, + s.Umee, uibc.IBCTransferStatus_IBC_TRANSFER_STATUS_QUOTA_DISABLED, ) s.Require().NoError(err) // Get the uibc params for quota checking - uibcParams, err := s.umee.QueryUIBCParams() + uibcParams, err := s.Umee.QueryUIBCParams() s.Require().NoError(err) s.Require().Equal(uibcParams.IbcStatus, uibc.IBCTransferStatus_IBC_TRANSFER_STATUS_QUOTA_DISABLED) token = sdk.NewInt64Coin("uumee", 100000000) // 100 Umee // sending the umee tokens - s.sendIBC(s.chain.id, gaiaChainID, "", token) + s.SendIBC(s.Chain.ID, setup.GaiaChainID, "", token) // Check the outflows s.checkSupply(gaiaAPIEndpoint, umeeIBCHash, token.Amount) s.Require().Eventually( func() bool { - a, err := queryOutflows(umeeAPIEndpoint, appparams.BondDenom) + a, err := s.QueryOutflows(umeeAPIEndpoint, appparams.BondDenom) s.Require().NoError(err) return a.Equal(sdk.ZeroDec()) }, @@ -188,7 +189,7 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { 5*time.Second, ) // resend the umee token from gaia to umee - s.sendIBC(gaiaChainID, s.chain.id, "", sdk.NewInt64Coin(umeeIBCHash, token.Amount.Int64())) + s.SendIBC(setup.GaiaChainID, s.Chain.ID, "", sdk.NewInt64Coin(umeeIBCHash, token.Amount.Int64())) s.checkSupply(gaiaAPIEndpoint, umeeIBCHash, sdk.ZeroInt()) }) @@ -203,17 +204,17 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { ) stakeIBCHash := "ibc/C053D637CCA2A2BA030E2C5EE1B28A16F71CCB0E45E8BE52766DC1B241B77878" - umeeAPIEndpoint := s.umeeREST() + umeeAPIEndpoint := s.UmeeREST() - valAddr, err := s.chain.validators[0].keyInfo.GetAddress() + valAddr, err := s.Chain.Validators[0].KeyInfo.GetAddress() s.Require().NoError(err) recipient := valAddr.String() token := sdk.NewInt64Coin("stake", 3300000000) // 3300stake - s.sendIBC(gaiaChainID, s.chain.id, recipient, token) + s.SendIBC(setup.GaiaChainID, s.Chain.ID, recipient, token) s.Require().Eventually( func() bool { - balances, err = queryUmeeAllBalances(umeeAPIEndpoint, recipient) + balances, err = s.QueryUmeeAllBalances(umeeAPIEndpoint, recipient) s.Require().NoError(err) // uncomment whene we re-enable inflow limit // return math.ZeroInt().Equal(balances.AmountOf(stakeIBCHash)) @@ -230,7 +231,7 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { s.Run("deploy_stake_erc20 ibcStakeERC20Addr", func() { s.T().Skip("paused due to Ethereum PoS migration and PoW fork") s.Require().NotEmpty(ibcStakeDenom) - ibcStakeERC20Addr = s.deployERC20Token(ibcStakeDenom) + ibcStakeERC20Addr = s.DeployERC20Token(ibcStakeDenom) }) // send 300 stake tokens from Umee to Ethereum @@ -242,7 +243,7 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10000)) gravityFee := sdk.NewCoin(ibcStakeDenom, math.NewInt(7)) - s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, ibcStakeERC20Addr, amount, umeeFee, gravityFee) + s.SendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, ibcStakeERC20Addr, amount, umeeFee, gravityFee) }) // send 300 stake tokens from Ethereum back to Umee @@ -252,6 +253,6 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { orchestratorIdxSender := 1 amount := uint64(300) - s.sendFromEthToUmeeCheck(orchestratorIdxSender, umeeValIdxReceiver, ibcStakeERC20Addr, ibcStakeDenom, amount) + s.SendFromEthToUmeeCheck(orchestratorIdxSender, umeeValIdxReceiver, ibcStakeERC20Addr, ibcStakeDenom, amount) }) } diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index f116fe1709..f413f71a17 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -1,30 +1,42 @@ package e2e import ( + "testing" + "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/suite" appparams "github.com/umee-network/umee/v4/app/params" + setup "github.com/umee-network/umee/v4/tests/e2e/setup" "github.com/umee-network/umee/v4/tests/grpc" ) -func (s *IntegrationTestSuite) TestPhotonTokenTransfers() { +type E2ETest struct { + setup.E2ETestSuite +} + +func TestE2ETesrtSuite(t *testing.T) { + suite.Run(t, new(E2ETest)) +} + +func (s *E2ETest) TestPhotonTokenTransfers() { s.T().Skip("paused due to Ethereum PoS migration and PoW fork") // deploy photon ERC20 token contact var photonERC20Addr string s.Run("deploy_photon_erc20", func() { - photonERC20Addr = s.deployERC20Token(photonDenom) + photonERC20Addr = s.DeployERC20Token(setup.PhotonDenom) }) // send 100 photon tokens from Umee to Ethereum s.Run("send_photon_tokens_to_eth", func() { umeeValIdxSender := 0 orchestratorIdxReceiver := 1 - amount := sdk.NewCoin(photonDenom, math.NewInt(100)) + amount := sdk.NewCoin(setup.PhotonDenom, math.NewInt(100)) umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10000)) - gravityFee := sdk.NewCoin(photonDenom, math.NewInt(3)) + gravityFee := sdk.NewCoin(setup.PhotonDenom, math.NewInt(3)) - s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, photonERC20Addr, amount, umeeFee, gravityFee) + s.SendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, photonERC20Addr, amount, umeeFee, gravityFee) }) // send 100 photon tokens from Ethereum back to Umee @@ -34,16 +46,16 @@ func (s *IntegrationTestSuite) TestPhotonTokenTransfers() { orchestratorIdxSender := 1 amount := uint64(100) - s.sendFromEthToUmeeCheck(orchestratorIdxSender, umeeValIdxReceiver, photonERC20Addr, photonDenom, amount) + s.SendFromEthToUmeeCheck(orchestratorIdxSender, umeeValIdxReceiver, photonERC20Addr, setup.PhotonDenom, amount) }) } -func (s *IntegrationTestSuite) TestUmeeTokenTransfers() { +func (s *E2ETest) TestUmeeTokenTransfers() { s.T().Skip("paused due to Ethereum PoS migration and PoW fork") // deploy umee ERC20 token contract var umeeERC20Addr string s.Run("deploy_umee_erc20", func() { - umeeERC20Addr = s.deployERC20Token(appparams.BondDenom) + umeeERC20Addr = s.DeployERC20Token(appparams.BondDenom) }) // send 300 umee tokens from Umee to Ethereum @@ -54,7 +66,7 @@ func (s *IntegrationTestSuite) TestUmeeTokenTransfers() { umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10000)) gravityFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(7)) - s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, umeeERC20Addr, amount, umeeFee, gravityFee) + s.SendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, umeeERC20Addr, amount, umeeFee, gravityFee) }) // send 300 umee tokens from Ethereum back to Umee @@ -63,7 +75,7 @@ func (s *IntegrationTestSuite) TestUmeeTokenTransfers() { orchestratorIdxSender := 1 amount := uint64(300) - s.sendFromEthToUmeeCheck(orchestratorIdxSender, umeeValIdxReceiver, umeeERC20Addr, appparams.BondDenom, amount) + s.SendFromEthToUmeeCheck(orchestratorIdxSender, umeeValIdxReceiver, umeeERC20Addr, appparams.BondDenom, amount) }) } @@ -71,13 +83,13 @@ func (s *IntegrationTestSuite) TestUmeeTokenTransfers() { // prices based on those params, checks that the stored medians and // medians deviations are correct, updates the oracle params with // a gov prop, then checks the medians and median deviations again. -func (s *IntegrationTestSuite) TestMedians() { - err := grpc.MedianCheck(s.umee) +func (s *E2ETest) TestMedians() { + err := grpc.MedianCheck(s.Umee) s.Require().NoError(err) } -func (s *IntegrationTestSuite) TestUpdateOracleParams() { - params, err := s.umee.QueryOracleParams() +func (s *E2ETest) TestUpdateOracleParams() { + params, err := s.Umee.QueryOracleParams() s.Require().NoError(err) s.Require().Equal(uint64(5), params.HistoricStampPeriod) @@ -85,12 +97,12 @@ func (s *IntegrationTestSuite) TestUpdateOracleParams() { s.Require().Equal(uint64(20), params.MedianStampPeriod) err = grpc.SubmitAndPassProposal( - s.umee, + s.Umee, grpc.OracleParamChanges(10, 2, 20), ) s.Require().NoError(err) - params, err = s.umee.QueryOracleParams() + params, err = s.Umee.QueryOracleParams() s.Require().NoError(err) s.Require().Equal(uint64(10), params.HistoricStampPeriod) diff --git a/tests/e2e/eth_abi.go b/tests/e2e/eth_abi.go deleted file mode 100644 index 3499d210bb..0000000000 --- a/tests/e2e/eth_abi.go +++ /dev/null @@ -1,33 +0,0 @@ -package e2e - -import ( - "github.com/ethereum/go-ethereum/accounts/abi" -) - -const ( - abiMethodNameBalanceOf = "balanceOf" -) - -var ( - abiAddressTy, _ = abi.NewType("address", "", nil) - abiUint256Ty, _ = abi.NewType("uint256", "", nil) - - ethABI = abi.ABI{ - Methods: map[string]abi.Method{ - abiMethodNameBalanceOf: abi.NewMethod( - abiMethodNameBalanceOf, - abiMethodNameBalanceOf, - abi.Function, - "view", - false, - false, - abi.Arguments{ - {Name: "account", Type: abiAddressTy}, - }, - abi.Arguments{ - {Type: abiUint256Ty}, - }, - ), - }, - } -) diff --git a/tests/e2e/chain.go b/tests/e2e/setup/chain.go similarity index 85% rename from tests/e2e/chain.go rename to tests/e2e/setup/chain.go index 77592231b0..e78a1a9d7a 100644 --- a/tests/e2e/chain.go +++ b/tests/e2e/setup/chain.go @@ -1,4 +1,4 @@ -package e2e +package e2esetup import ( "fmt" @@ -23,7 +23,7 @@ const ( var ( encodingConfig sdkparams.EncodingConfig - cdc codec.Codec + Cdc codec.Codec ) func init() { @@ -39,15 +39,15 @@ func init() { &ed25519.PubKey{}, ) - cdc = encodingConfig.Codec + Cdc = encodingConfig.Codec } type chain struct { dataDir string - id string - validators []*validator - orchestrators []*orchestrator - gaiaValidators []*gaiaValidator + ID string + Validators []*validator + Orchestrators []*orchestrator + GaiaValidators []*gaiaValidator } func newChain() (*chain, error) { @@ -57,13 +57,13 @@ func newChain() (*chain, error) { } return &chain{ - id: "chain-" + tmrand.NewRand().Str(6), + ID: "chain-" + tmrand.NewRand().Str(6), dataDir: tmpDir, }, nil } func (c *chain) configDir() string { - return fmt.Sprintf("%s/%s", c.dataDir, c.id) + return fmt.Sprintf("%s/%s", c.dataDir, c.ID) } func (c *chain) createAndInitValidators(count int) error { @@ -75,7 +75,7 @@ func (c *chain) createAndInitValidators(count int) error { return err } - c.validators = append(c.validators, node) + c.Validators = append(c.Validators, node) // create keys if err := node.createKey("val"); err != nil { @@ -105,7 +105,7 @@ func (c *chain) createAndInitGaiaValidator() error { gaiaVal.keyInfo = *info gaiaVal.mnemonic = mnemonic - c.gaiaValidators = append(c.gaiaValidators, gaiaVal) + c.GaiaValidators = append(c.GaiaValidators, gaiaVal) return nil } @@ -125,7 +125,7 @@ func (c *chain) createAndInitOrchestrators(count int) error { return err } - c.orchestrators = append(c.orchestrators, orchestrator) + c.Orchestrators = append(c.Orchestrators, orchestrator) } return nil @@ -141,7 +141,7 @@ func (c *chain) createValidator(index int) *validator { func (c *chain) createOrchestrator(index int) *orchestrator { return &orchestrator{ - index: index, + Index: index, } } diff --git a/tests/e2e/setup/eth_abi.go b/tests/e2e/setup/eth_abi.go new file mode 100644 index 0000000000..204701461b --- /dev/null +++ b/tests/e2e/setup/eth_abi.go @@ -0,0 +1,33 @@ +package e2esetup + +import ( + "github.com/ethereum/go-ethereum/accounts/abi" +) + +const ( + AbiMethodNameBalanceOf = "balanceOf" +) + +var ( + AbiAddressTy, _ = abi.NewType("address", "", nil) + AbiUint256Ty, _ = abi.NewType("uint256", "", nil) + + EthABI = abi.ABI{ + Methods: map[string]abi.Method{ + AbiMethodNameBalanceOf: abi.NewMethod( + AbiMethodNameBalanceOf, + AbiMethodNameBalanceOf, + abi.Function, + "view", + false, + false, + abi.Arguments{ + {Name: "account", Type: AbiAddressTy}, + }, + abi.Arguments{ + {Type: AbiUint256Ty}, + }, + ), + }, + } +) diff --git a/tests/e2e/ethereum.go b/tests/e2e/setup/ethereum.go similarity index 97% rename from tests/e2e/ethereum.go rename to tests/e2e/setup/ethereum.go index cbbac5d6a8..979f1dafbd 100644 --- a/tests/e2e/ethereum.go +++ b/tests/e2e/setup/ethereum.go @@ -1,4 +1,4 @@ -package e2e +package e2esetup type EthereumConfig struct { ChainID uint `json:"chainId"` diff --git a/tests/e2e/gaia.go b/tests/e2e/setup/gaia.go similarity index 93% rename from tests/e2e/gaia.go rename to tests/e2e/setup/gaia.go index 1e5f313457..0b1781b3b5 100644 --- a/tests/e2e/gaia.go +++ b/tests/e2e/setup/gaia.go @@ -1,4 +1,4 @@ -package e2e +package e2esetup import ( "fmt" diff --git a/tests/e2e/genesis.go b/tests/e2e/setup/genesis.go similarity index 91% rename from tests/e2e/genesis.go rename to tests/e2e/setup/genesis.go index 8ef24b8117..b51ad5c19f 100644 --- a/tests/e2e/genesis.go +++ b/tests/e2e/setup/genesis.go @@ -1,4 +1,4 @@ -package e2e +package e2esetup import ( "encoding/json" @@ -59,7 +59,7 @@ func addGenesisAccount(path, moniker, amountStr string, accAddr sdk.AccAddress) return fmt.Errorf("failed to unmarshal genesis state: %w", err) } - authGenState := authtypes.GetGenesisStateFromAppState(cdc, appState) + authGenState := authtypes.GetGenesisStateFromAppState(Cdc, appState) accs, err := authtypes.UnpackAccounts(authGenState.Accounts) if err != nil { @@ -82,18 +82,18 @@ func addGenesisAccount(path, moniker, amountStr string, accAddr sdk.AccAddress) authGenState.Accounts = genAccs - authGenStateBz, err := cdc.MarshalJSON(&authGenState) + authGenStateBz, err := Cdc.MarshalJSON(&authGenState) if err != nil { return fmt.Errorf("failed to marshal auth genesis state: %w", err) } appState[authtypes.ModuleName] = authGenStateBz - bankGenState := banktypes.GetGenesisStateFromAppState(cdc, appState) + bankGenState := banktypes.GetGenesisStateFromAppState(Cdc, appState) bankGenState.Balances = append(bankGenState.Balances, balances) bankGenState.Balances = banktypes.SanitizeGenesisBalances(bankGenState.Balances) - bankGenStateBz, err := cdc.MarshalJSON(bankGenState) + bankGenStateBz, err := Cdc.MarshalJSON(bankGenState) if err != nil { return fmt.Errorf("failed to marshal bank genesis state: %w", err) } diff --git a/tests/e2e/io.go b/tests/e2e/setup/io.go similarity index 97% rename from tests/e2e/io.go rename to tests/e2e/setup/io.go index 837f29a984..32ab24f4eb 100644 --- a/tests/e2e/io.go +++ b/tests/e2e/setup/io.go @@ -1,4 +1,4 @@ -package e2e +package e2esetup import ( "fmt" diff --git a/tests/e2e/keys.go b/tests/e2e/setup/keys.go similarity index 61% rename from tests/e2e/keys.go rename to tests/e2e/setup/keys.go index 2e9c941475..9d605445eb 100644 --- a/tests/e2e/keys.go +++ b/tests/e2e/setup/keys.go @@ -1,10 +1,33 @@ -package e2e +package e2esetup import ( "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/go-bip39" + appparams "github.com/umee-network/umee/v4/app/params" +) + +const ( + PhotonDenom = "photon" + InitBalanceStr = "510000000000" + appparams.BondDenom + ",100000000000" + PhotonDenom + GaiaChainID = "test-gaia-chain" + + EthChainID uint = 15 + EthMinerPK = "0xb1bab011e03a9862664706fc3bbaa1b16651528e5f0e7fbfcbfdd8be302a13e7" + + PriceFeederContainerRepo = "ghcr.io/umee-network/price-feeder-umee" + PriceFeederServerPort = "7171/tcp" + PriceFeederMaxStartupTime = 20 // seconds +) + +var ( + minGasPrice = appparams.ProtocolMinGasPrice.String() + stakeAmount, _ = sdk.NewIntFromString("100000000000") + stakeAmountCoin = sdk.NewCoin(appparams.BondDenom, stakeAmount) + + stakeAmount2, _ = sdk.NewIntFromString("500000000000") + stakeAmountCoin2 = sdk.NewCoin(appparams.BondDenom, stakeAmount2) ) var ( @@ -42,7 +65,7 @@ func createMemoryKey() (mnemonic string, info *keyring.Record, err error) { } func createMemoryKeyFromMnemonic(mnemonic string) (*keyring.Record, error) { - kb, err := keyring.New("testnet", keyring.BackendMemory, "", nil, cdc) + kb, err := keyring.New("testnet", keyring.BackendMemory, "", nil, Cdc) if err != nil { return nil, err } diff --git a/tests/e2e/orchestrator.go b/tests/e2e/setup/orchestrator.go similarity index 80% rename from tests/e2e/orchestrator.go rename to tests/e2e/setup/orchestrator.go index 3e51fb458f..e32d03606b 100644 --- a/tests/e2e/orchestrator.go +++ b/tests/e2e/setup/orchestrator.go @@ -1,4 +1,4 @@ -package e2e +package e2esetup import ( "crypto/ecdsa" @@ -14,21 +14,21 @@ import ( ) type orchestrator struct { - index int - mnemonic string + Index int + Mnemonic string keyInfo keyring.Record - privateKey cryptotypes.PrivKey - ethereumKey ethereumKey + PrivateKey cryptotypes.PrivKey + EthereumKey ethereumKey } type ethereumKey struct { - publicKey string - privateKey string - address string + PublicKey string + PrivateKey string + Address string } func (o *orchestrator) instanceName() string { - return fmt.Sprintf("orchestrator%d", o.index) + return fmt.Sprintf("orchestrator%d", o.Index) } func (o *orchestrator) generateEthereumKey() error { @@ -47,10 +47,10 @@ func (o *orchestrator) generateEthereumKey() error { publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA) - o.ethereumKey = ethereumKey{ - privateKey: hexutil.Encode(privateKeyBytes), - publicKey: hexutil.Encode(publicKeyBytes), - address: crypto.PubkeyToAddress(*publicKeyECDSA).Hex(), + o.EthereumKey = ethereumKey{ + PrivateKey: hexutil.Encode(privateKeyBytes), + PublicKey: hexutil.Encode(publicKeyBytes), + Address: crypto.PubkeyToAddress(*publicKeyECDSA).Hex(), } return nil @@ -66,7 +66,7 @@ func (o *orchestrator) createKey(name string) error { } func (o *orchestrator) createKeyFromMnemonic(name, mnemonic string) error { - kb, err := keyring.New(keyringAppName, keyring.BackendMemory, "", nil, cdc) + kb, err := keyring.New(keyringAppName, keyring.BackendMemory, "", nil, Cdc) if err != nil { return err } @@ -93,8 +93,8 @@ func (o *orchestrator) createKeyFromMnemonic(name, mnemonic string) error { } o.keyInfo = *info - o.mnemonic = mnemonic - o.privateKey = privKey + o.Mnemonic = mnemonic + o.PrivateKey = privKey return nil } diff --git a/tests/e2e/e2e_setup_test.go b/tests/e2e/setup/setup.go similarity index 71% rename from tests/e2e/e2e_setup_test.go rename to tests/e2e/setup/setup.go index 3415a08e68..92fa643b3a 100644 --- a/tests/e2e/e2e_setup_test.go +++ b/tests/e2e/setup/setup.go @@ -1,4 +1,4 @@ -package e2e +package e2esetup import ( "bytes" @@ -13,7 +13,6 @@ import ( "regexp" "strconv" "strings" - "testing" "time" gravitytypes "github.com/Gravity-Bridge/Gravity-Bridge/module/x/gravity/types" @@ -44,64 +43,38 @@ import ( "github.com/umee-network/umee/v4/x/uibc" ) -const ( - photonDenom = "photon" - initBalanceStr = "510000000000" + appparams.BondDenom + ",100000000000" + photonDenom - gaiaChainID = "test-gaia-chain" - - ethChainID uint = 15 - ethMinerPK = "0xb1bab011e03a9862664706fc3bbaa1b16651528e5f0e7fbfcbfdd8be302a13e7" - - priceFeederContainerRepo = "ghcr.io/umee-network/price-feeder-umee" - priceFeederServerPort = "7171/tcp" - priceFeederMaxStartupTime = 20 // seconds -) - -var ( - minGasPrice = appparams.ProtocolMinGasPrice.String() - stakeAmount, _ = sdk.NewIntFromString("100000000000") - stakeAmountCoin = sdk.NewCoin(appparams.BondDenom, stakeAmount) - - stakeAmount2, _ = sdk.NewIntFromString("500000000000") - stakeAmountCoin2 = sdk.NewCoin(appparams.BondDenom, stakeAmount2) -) - -type IntegrationTestSuite struct { +type E2ETestSuite struct { suite.Suite tmpDirs []string - chain *chain - ethClient *ethclient.Client + Chain *chain + EthClient *ethclient.Client gaiaRPC *rpchttp.HTTP - dkrPool *dockertest.Pool - dkrNet *dockertest.Network - ethResource *dockertest.Resource - gaiaResource *dockertest.Resource - hermesResource *dockertest.Resource + DkrPool *dockertest.Pool + DkrNet *dockertest.Network + EthResource *dockertest.Resource + GaiaResource *dockertest.Resource + HermesResource *dockertest.Resource priceFeederResource *dockertest.Resource - valResources []*dockertest.Resource - orchResources []*dockertest.Resource - gravityContractAddr string - umee client.Client + ValResources []*dockertest.Resource + OrchResources []*dockertest.Resource + GravityContractAddr string + Umee client.Client } -func TestIntegrationTestSuite(t *testing.T) { - suite.Run(t, new(IntegrationTestSuite)) -} - -func (s *IntegrationTestSuite) SetupSuite() { +func (s *E2ETestSuite) SetupSuite() { s.T().Log("setting up e2e integration test suite...") var err error - s.chain, err = newChain() + s.Chain, err = newChain() s.Require().NoError(err) - s.T().Logf("starting e2e infrastructure; chain-id: %s; datadir: %s", s.chain.id, s.chain.dataDir) + s.T().Logf("starting e2e infrastructure; chain-id: %s; datadir: %s", s.Chain.ID, s.Chain.dataDir) - s.dkrPool, err = dockertest.NewPool("") + s.DkrPool, err = dockertest.NewPool("") s.Require().NoError(err) - s.dkrNet, err = s.dkrPool.CreateNetwork(fmt.Sprintf("%s-testnet", s.chain.id)) + s.DkrNet, err = s.DkrPool.CreateNetwork(fmt.Sprintf("%s-testnet", s.Chain.ID)) s.Require().NoError(err) s.T().Logf("Ethereum and peggo are disable due to Ethereum PoS migration and PoW fork") @@ -140,7 +113,7 @@ func (s *IntegrationTestSuite) SetupSuite() { s.initUmeeClient() } -func (s *IntegrationTestSuite) TearDownSuite() { +func (s *E2ETestSuite) TearDownSuite() { if str := os.Getenv("UMEE_E2E_SKIP_CLEANUP"); len(str) > 0 { skipCleanup, err := strconv.ParseBool(str) s.Require().NoError(err) @@ -152,54 +125,54 @@ func (s *IntegrationTestSuite) TearDownSuite() { s.T().Log("tearing down e2e integration test suite...") - // s.Require().NoError(s.dkrPool.Purge(s.ethResource)) - s.Require().NoError(s.dkrPool.Purge(s.gaiaResource)) - s.Require().NoError(s.dkrPool.Purge(s.hermesResource)) - s.Require().NoError(s.dkrPool.Purge(s.priceFeederResource)) + // s.Require().NoError(s.DkrPool.Purge(s.ethResource)) + s.Require().NoError(s.DkrPool.Purge(s.GaiaResource)) + s.Require().NoError(s.DkrPool.Purge(s.HermesResource)) + s.Require().NoError(s.DkrPool.Purge(s.priceFeederResource)) - for _, vc := range s.valResources { - s.Require().NoError(s.dkrPool.Purge(vc)) + for _, vc := range s.ValResources { + s.Require().NoError(s.DkrPool.Purge(vc)) } - // for _, oc := range s.orchResources { - // s.Require().NoError(s.dkrPool.Purge(oc)) + // for _, oc := range s.OrchResources { + // s.Require().NoError(s.DkrPool.Purge(oc)) // } - s.Require().NoError(s.dkrPool.RemoveNetwork(s.dkrNet)) + s.Require().NoError(s.DkrPool.RemoveNetwork(s.DkrNet)) - os.RemoveAll(s.chain.dataDir) + os.RemoveAll(s.Chain.dataDir) for _, td := range s.tmpDirs { os.RemoveAll(td) } } -func (s *IntegrationTestSuite) initNodes() { - s.Require().NoError(s.chain.createAndInitValidators(3)) - s.Require().NoError(s.chain.createAndInitOrchestrators(3)) - s.Require().NoError(s.chain.createAndInitGaiaValidator()) +func (s *E2ETestSuite) initNodes() { + s.Require().NoError(s.Chain.createAndInitValidators(3)) + s.Require().NoError(s.Chain.createAndInitOrchestrators(3)) + s.Require().NoError(s.Chain.createAndInitGaiaValidator()) // initialize a genesis file for the first validator - val0ConfigDir := s.chain.validators[0].configDir() - for _, val := range s.chain.validators { - valAddr, err := val.keyInfo.GetAddress() + val0ConfigDir := s.Chain.Validators[0].configDir() + for _, val := range s.Chain.Validators { + valAddr, err := val.KeyInfo.GetAddress() s.Require().NoError(err) s.Require().NoError( - addGenesisAccount(val0ConfigDir, "", initBalanceStr, valAddr), + addGenesisAccount(val0ConfigDir, "", InitBalanceStr, valAddr), ) } // add orchestrator accounts to genesis file - for _, orch := range s.chain.orchestrators { + for _, orch := range s.Chain.Orchestrators { orchAddr, err := orch.keyInfo.GetAddress() s.Require().NoError(err) s.Require().NoError( - addGenesisAccount(val0ConfigDir, "", initBalanceStr, orchAddr), + addGenesisAccount(val0ConfigDir, "", InitBalanceStr, orchAddr), ) } // copy the genesis file to the remaining validators - for _, val := range s.chain.validators[1:] { + for _, val := range s.Chain.Validators[1:] { _, err := copyFile( filepath.Join(val0ConfigDir, "config", "genesis.json"), filepath.Join(val.configDir(), "config", "genesis.json"), @@ -208,13 +181,13 @@ func (s *IntegrationTestSuite) initNodes() { } } -func (s *IntegrationTestSuite) initEthereum() { +func (s *E2ETestSuite) initEthereum() { // generate ethereum keys for validators add them to the ethereum genesis ethGenesis := EthereumGenesis{ Difficulty: "0x400", GasLimit: "0xB71B00", - Config: EthereumConfig{ChainID: ethChainID}, - Alloc: make(map[string]Allocation, len(s.chain.validators)+1), + Config: EthereumConfig{ChainID: EthChainID}, + Alloc: make(map[string]Allocation, len(s.Chain.Validators)+1), } alloc := Allocation{ @@ -222,23 +195,23 @@ func (s *IntegrationTestSuite) initEthereum() { } ethGenesis.Alloc["0xBf660843528035a5A4921534E156a27e64B231fE"] = alloc - for _, orch := range s.chain.orchestrators { + for _, orch := range s.Chain.Orchestrators { s.Require().NoError(orch.generateEthereumKey()) - ethGenesis.Alloc[orch.ethereumKey.address] = alloc + ethGenesis.Alloc[orch.EthereumKey.Address] = alloc } ethGenBz, err := json.MarshalIndent(ethGenesis, "", " ") s.Require().NoError(err) // write out the genesis file - s.Require().NoError(writeFile(filepath.Join(s.chain.configDir(), "eth_genesis.json"), ethGenBz)) + s.Require().NoError(writeFile(filepath.Join(s.Chain.configDir(), "eth_genesis.json"), ethGenBz)) } -func (s *IntegrationTestSuite) initGenesis() { +func (s *E2ETestSuite) initGenesis() { serverCtx := server.NewDefaultContext() config := serverCtx.Config - config.SetRoot(s.chain.validators[0].configDir()) - config.Moniker = s.chain.validators[0].moniker + config.SetRoot(s.Chain.Validators[0].configDir()) + config.Moniker = s.Chain.Validators[0].moniker genFilePath := config.GenesisFile() s.T().Log("starting e2e infrastructure; validator_0 config:", genFilePath) @@ -247,40 +220,40 @@ func (s *IntegrationTestSuite) initGenesis() { // Gravity Bridge var gravityGenState gravitytypes.GenesisState - s.Require().NoError(cdc.UnmarshalJSON(appGenState[gravitytypes.ModuleName], &gravityGenState)) + s.Require().NoError(Cdc.UnmarshalJSON(appGenState[gravitytypes.ModuleName], &gravityGenState)) - gravityGenState.Params.BridgeChainId = uint64(ethChainID) + gravityGenState.Params.BridgeChainId = uint64(EthChainID) - bz, err := cdc.MarshalJSON(&gravityGenState) + bz, err := Cdc.MarshalJSON(&gravityGenState) s.Require().NoError(err) appGenState[gravitytypes.ModuleName] = bz var bech32GenState bech32ibctypes.GenesisState - s.Require().NoError(cdc.UnmarshalJSON(appGenState[bech32ibctypes.ModuleName], &bech32GenState)) + s.Require().NoError(Cdc.UnmarshalJSON(appGenState[bech32ibctypes.ModuleName], &bech32GenState)) // bech32 bech32GenState.NativeHRP = sdk.GetConfig().GetBech32AccountAddrPrefix() - bz, err = cdc.MarshalJSON(&bech32GenState) + bz, err = Cdc.MarshalJSON(&bech32GenState) s.Require().NoError(err) appGenState[bech32ibctypes.ModuleName] = bz // Leverage var leverageGenState leveragetypes.GenesisState - s.Require().NoError(cdc.UnmarshalJSON(appGenState[leveragetypes.ModuleName], &leverageGenState)) + s.Require().NoError(Cdc.UnmarshalJSON(appGenState[leveragetypes.ModuleName], &leverageGenState)) leverageGenState.Registry = append(leverageGenState.Registry, fixtures.Token(appparams.BondDenom, appparams.DisplayDenom, 6), fixtures.Token(ATOMBaseDenom, ATOM, uint32(ATOMExponent)), ) - bz, err = cdc.MarshalJSON(&leverageGenState) + bz, err = Cdc.MarshalJSON(&leverageGenState) s.Require().NoError(err) appGenState[leveragetypes.ModuleName] = bz // Oracle var oracleGenState oracletypes.GenesisState - s.Require().NoError(cdc.UnmarshalJSON(appGenState[oracletypes.ModuleName], &oracleGenState)) + s.Require().NoError(Cdc.UnmarshalJSON(appGenState[oracletypes.ModuleName], &oracleGenState)) oracleGenState.Params.HistoricStampPeriod = 5 oracleGenState.Params.MaximumPriceStamps = 4 @@ -293,47 +266,47 @@ func (s *IntegrationTestSuite) initGenesis() { Exponent: uint32(ATOMExponent), }) - bz, err = cdc.MarshalJSON(&oracleGenState) + bz, err = Cdc.MarshalJSON(&oracleGenState) s.Require().NoError(err) appGenState[oracletypes.ModuleName] = bz // Gov var govGenState govtypesv1.GenesisState - s.Require().NoError(cdc.UnmarshalJSON(appGenState[govtypes.ModuleName], &govGenState)) + s.Require().NoError(Cdc.UnmarshalJSON(appGenState[govtypes.ModuleName], &govGenState)) votingPeroid := 5 * time.Second govGenState.VotingParams.VotingPeriod = &votingPeroid govGenState.DepositParams.MinDeposit = sdk.NewCoins(sdk.NewCoin(appparams.BondDenom, sdk.NewInt(100))) - bz, err = cdc.MarshalJSON(&govGenState) + bz, err = Cdc.MarshalJSON(&govGenState) s.Require().NoError(err) appGenState[govtypes.ModuleName] = bz // Bank var bankGenState banktypes.GenesisState - s.Require().NoError(cdc.UnmarshalJSON(appGenState[banktypes.ModuleName], &bankGenState)) + s.Require().NoError(Cdc.UnmarshalJSON(appGenState[banktypes.ModuleName], &bankGenState)) bankGenState.DenomMetadata = append(bankGenState.DenomMetadata, banktypes.Metadata{ Description: "An example stable token", - Display: photonDenom, - Base: photonDenom, - Symbol: photonDenom, - Name: photonDenom, + Display: PhotonDenom, + Base: PhotonDenom, + Symbol: PhotonDenom, + Name: PhotonDenom, DenomUnits: []*banktypes.DenomUnit{ { - Denom: photonDenom, + Denom: PhotonDenom, Exponent: 0, }, }, }) - bz, err = cdc.MarshalJSON(&bankGenState) + bz, err = Cdc.MarshalJSON(&bankGenState) s.Require().NoError(err) appGenState[banktypes.ModuleName] = bz // uibc (ibc quota) var uibcGenState uibc.GenesisState - s.Require().NoError(cdc.UnmarshalJSON(appGenState[uibc.ModuleName], &uibcGenState)) + s.Require().NoError(Cdc.UnmarshalJSON(appGenState[uibc.ModuleName], &uibcGenState)) // 100$ for each token uibcGenState.Params.TokenQuota = sdk.NewDec(100) @@ -342,16 +315,16 @@ func (s *IntegrationTestSuite) initGenesis() { // quotas will reset every 300 seconds uibcGenState.Params.QuotaDuration = time.Second * 300 - bz, err = cdc.MarshalJSON(&uibcGenState) + bz, err = Cdc.MarshalJSON(&uibcGenState) s.Require().NoError(err) appGenState[uibc.ModuleName] = bz var genUtilGenState genutiltypes.GenesisState - s.Require().NoError(cdc.UnmarshalJSON(appGenState[genutiltypes.ModuleName], &genUtilGenState)) + s.Require().NoError(Cdc.UnmarshalJSON(appGenState[genutiltypes.ModuleName], &genUtilGenState)) // generate genesis txs - genTxs := make([]json.RawMessage, len(s.chain.validators)) - for i, val := range s.chain.validators { + genTxs := make([]json.RawMessage, len(s.Chain.Validators)) + for i, val := range s.Chain.Validators { var createValmsg sdk.Msg if i == 2 { createValmsg, err = val.buildCreateValidatorMsg(stakeAmountCoin2) @@ -360,16 +333,16 @@ func (s *IntegrationTestSuite) initGenesis() { } s.Require().NoError(err) - orchAddr, err := s.chain.orchestrators[i].keyInfo.GetAddress() + orchAddr, err := s.Chain.Orchestrators[i].keyInfo.GetAddress() s.Require().NoError(err) - delKeysMsg, err := val.buildDelegateKeysMsg(orchAddr, s.chain.orchestrators[i].ethereumKey.address) + delKeysMsg, err := val.buildDelegateKeysMsg(orchAddr, s.Chain.Orchestrators[i].EthereumKey.Address) s.Require().NoError(err) signedTx, err := val.signMsg(createValmsg, delKeysMsg) s.Require().NoError(err) - txRaw, err := cdc.MarshalJSON(signedTx) + txRaw, err := Cdc.MarshalJSON(signedTx) s.Require().NoError(err) genTxs[i] = txRaw @@ -377,7 +350,7 @@ func (s *IntegrationTestSuite) initGenesis() { genUtilGenState.GenTxs = genTxs - bz, err = cdc.MarshalJSON(&genUtilGenState) + bz, err = Cdc.MarshalJSON(&genUtilGenState) s.Require().NoError(err) appGenState[genutiltypes.ModuleName] = bz @@ -390,13 +363,13 @@ func (s *IntegrationTestSuite) initGenesis() { s.Require().NoError(err) // write the updated genesis file to each validator - for _, val := range s.chain.validators { + for _, val := range s.Chain.Validators { writeFile(filepath.Join(val.configDir(), "config", "genesis.json"), bz) } } -func (s *IntegrationTestSuite) initValidatorConfigs() { - for i, val := range s.chain.validators { +func (s *E2ETestSuite) initValidatorConfigs() { + for i, val := range s.Chain.Validators { tmCfgPath := filepath.Join(val.configDir(), "config", "config.toml") vpr := viper.New() @@ -415,12 +388,12 @@ func (s *IntegrationTestSuite) initValidatorConfigs() { var peers []string - for j := 0; j < len(s.chain.validators); j++ { + for j := 0; j < len(s.Chain.Validators); j++ { if i == j { continue } - peer := s.chain.validators[j] + peer := s.Chain.Validators[j] peerID := fmt.Sprintf("%s@%s%d:26656", peer.nodeKey.ID(), peer.moniker, j) peers = append(peers, peerID) } @@ -440,7 +413,7 @@ func (s *IntegrationTestSuite) initValidatorConfigs() { } } -func (s *IntegrationTestSuite) runGanacheContainer() { +func (s *E2ETestSuite) runGanacheContainer() { s.T().Log("starting Ganache container...") tmpDir, err := os.MkdirTemp("", "umee-e2e-testnet-eth-") @@ -462,19 +435,19 @@ func (s *IntegrationTestSuite) runGanacheContainer() { } entrypoint = append(entrypoint, "--account", "0xb1bab011e03a9862664706fc3bbaa1b16651528e5f0e7fbfcbfdd8be302a13e7,0x3635C9ADC5DEA00000") - for _, orch := range s.chain.orchestrators { + for _, orch := range s.Chain.Orchestrators { s.Require().NoError(orch.generateEthereumKey()) - entrypoint = append(entrypoint, "--account", orch.ethereumKey.privateKey+",0x3635C9ADC5DEA00000") + entrypoint = append(entrypoint, "--account", orch.EthereumKey.PrivateKey+",0x3635C9ADC5DEA00000") } - s.ethResource, err = s.dkrPool.BuildAndRunWithBuildOptions( + s.EthResource, err = s.DkrPool.BuildAndRunWithBuildOptions( &dockertest.BuildOptions{ Dockerfile: "ganache.Dockerfile", ContextDir: tmpDir, }, &dockertest.RunOptions{ Name: "ganache", - NetworkID: s.dkrNet.Network.ID, + NetworkID: s.DkrNet.Network.ID, ExposedPorts: []string{"8545"}, PortBindings: map[docker.Port][]docker.PortBinding{ "8545/tcp": {{HostIP: "", HostPort: "8545"}}, @@ -486,7 +459,7 @@ func (s *IntegrationTestSuite) runGanacheContainer() { ) s.Require().NoError(err) - s.ethClient, err = ethclient.Dial(fmt.Sprintf("http://%s", s.ethResource.GetHostPort("8545/tcp"))) + s.EthClient, err = ethclient.Dial(fmt.Sprintf("http://%s", s.EthResource.GetHostPort("8545/tcp"))) s.Require().NoError(err) match := "Listening on 0.0.0.0:8545" @@ -499,9 +472,9 @@ func (s *IntegrationTestSuite) runGanacheContainer() { // Wait for Ganache to start running. s.Require().Eventually( func() bool { - err := s.dkrPool.Client.Logs( + err := s.DkrPool.Client.Logs( docker.LogsOptions{ - Container: s.ethResource.Container.ID, + Container: s.EthResource.Container.ID, OutputStream: &outBuf, ErrorStream: &errBuf, Stdout: true, @@ -518,17 +491,17 @@ func (s *IntegrationTestSuite) runGanacheContainer() { 5*time.Second, "ganache node failed to start", ) - s.T().Logf("started Ganache container: %s", s.ethResource.Container.ID) + s.T().Logf("started Ganache container: %s", s.EthResource.Container.ID) } -func (s *IntegrationTestSuite) runEthContainer() { +func (s *E2ETestSuite) runEthContainer() { s.T().Log("starting Ethereum container...") tmpDir, err := os.MkdirTemp("", "umee-e2e-testnet-eth-") s.Require().NoError(err) s.tmpDirs = append(s.tmpDirs, tmpDir) _, err = copyFile( - filepath.Join(s.chain.configDir(), "eth_genesis.json"), + filepath.Join(s.Chain.configDir(), "eth_genesis.json"), filepath.Join(tmpDir, "eth_genesis.json"), ) s.Require().NoError(err) @@ -539,14 +512,14 @@ func (s *IntegrationTestSuite) runEthContainer() { ) s.Require().NoError(err) - s.ethResource, err = s.dkrPool.BuildAndRunWithBuildOptions( + s.EthResource, err = s.DkrPool.BuildAndRunWithBuildOptions( &dockertest.BuildOptions{ Dockerfile: "eth.Dockerfile", ContextDir: tmpDir, }, &dockertest.RunOptions{ Name: "ethereum", - NetworkID: s.dkrNet.Network.ID, + NetworkID: s.DkrNet.Network.ID, PortBindings: map[docker.Port][]docker.PortBinding{ "8545/tcp": {{HostIP: "", HostPort: "8545"}}, }, @@ -556,7 +529,7 @@ func (s *IntegrationTestSuite) runEthContainer() { ) s.Require().NoError(err) - s.ethClient, err = ethclient.Dial(fmt.Sprintf("http://%s", s.ethResource.GetHostPort("8545/tcp"))) + s.EthClient, err = ethclient.Dial(fmt.Sprintf("http://%s", s.EthResource.GetHostPort("8545/tcp"))) s.Require().NoError(err) // Wait for the Ethereum node to start producing blocks; DAG completion takes @@ -566,7 +539,7 @@ func (s *IntegrationTestSuite) runEthContainer() { ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() - height, err := s.ethClient.BlockNumber(ctx) + height, err := s.EthClient.BlockNumber(ctx) if err != nil { return false } @@ -578,17 +551,17 @@ func (s *IntegrationTestSuite) runEthContainer() { "geth node failed to produce a block", ) - s.T().Logf("started Ethereum container: %s", s.ethResource.Container.ID) + s.T().Logf("started Ethereum container: %s", s.EthResource.Container.ID) } -func (s *IntegrationTestSuite) runValidators() { +func (s *E2ETestSuite) runValidators() { s.T().Log("starting Umee validator containers...") - s.valResources = make([]*dockertest.Resource, len(s.chain.validators)) - for i, val := range s.chain.validators { + s.ValResources = make([]*dockertest.Resource, len(s.Chain.Validators)) + for i, val := range s.Chain.Validators { runOpts := &dockertest.RunOptions{ Name: val.instanceName(), - NetworkID: s.dkrNet.Network.ID, + NetworkID: s.DkrNet.Network.ID, Mounts: []string{ fmt.Sprintf("%s/:/root/.umee", val.configDir()), }, @@ -611,10 +584,10 @@ func (s *IntegrationTestSuite) runValidators() { } } - resource, err := s.dkrPool.RunWithOptions(runOpts, noRestart) + resource, err := s.DkrPool.RunWithOptions(runOpts, noRestart) s.Require().NoError(err) - s.valResources[i] = resource + s.ValResources[i] = resource s.T().Logf("started Umee validator container: %s", resource.Container.ID) } @@ -644,14 +617,14 @@ func (s *IntegrationTestSuite) runValidators() { ) } -func (s *IntegrationTestSuite) runGaiaNetwork() { +func (s *E2ETestSuite) runGaiaNetwork() { s.T().Log("starting Gaia network container...") tmpDir, err := os.MkdirTemp("", "umee-e2e-testnet-gaia-") s.Require().NoError(err) s.tmpDirs = append(s.tmpDirs, tmpDir) - gaiaVal := s.chain.gaiaValidators[0] + gaiaVal := s.Chain.GaiaValidators[0] gaiaCfgPath := path.Join(tmpDir, "cfg") s.Require().NoError(os.MkdirAll(gaiaCfgPath, 0o755)) @@ -662,12 +635,12 @@ func (s *IntegrationTestSuite) runGaiaNetwork() { ) s.Require().NoError(err) - s.gaiaResource, err = s.dkrPool.RunWithOptions( + s.GaiaResource, err = s.DkrPool.RunWithOptions( &dockertest.RunOptions{ Name: gaiaVal.instanceName(), Repository: "ghcr.io/umee-network/gaia-e2e", Tag: "latest", - NetworkID: s.dkrNet.Network.ID, + NetworkID: s.DkrNet.Network.ID, Mounts: []string{ fmt.Sprintf("%s/:/root/.gaia", tmpDir), }, @@ -678,7 +651,7 @@ func (s *IntegrationTestSuite) runGaiaNetwork() { "26657/tcp": {{HostIP: "", HostPort: "27657"}}, }, Env: []string{ - fmt.Sprintf("UMEE_E2E_GAIA_CHAIN_ID=%s", gaiaChainID), + fmt.Sprintf("UMEE_E2E_GAIA_CHAIN_ID=%s", GaiaChainID), fmt.Sprintf("UMEE_E2E_GAIA_VAL_MNEMONIC=%s", gaiaVal.mnemonic), }, Entrypoint: []string{ @@ -691,7 +664,7 @@ func (s *IntegrationTestSuite) runGaiaNetwork() { ) s.Require().NoError(err) - endpoint := fmt.Sprintf("tcp://%s", s.gaiaResource.GetHostPort("26657/tcp")) + endpoint := fmt.Sprintf("tcp://%s", s.GaiaResource.GetHostPort("26657/tcp")) s.gaiaRPC, err = rpchttp.New(endpoint, "/websocket") s.Require().NoError(err) @@ -717,20 +690,20 @@ func (s *IntegrationTestSuite) runGaiaNetwork() { "gaia node failed to produce blocks", ) - s.T().Logf("started Gaia network container: %s", s.gaiaResource.Container.ID) + s.T().Logf("started Gaia network container: %s", s.GaiaResource.Container.ID) } -func (s *IntegrationTestSuite) runIBCRelayer() { +func (s *E2ETestSuite) runIBCRelayer() { s.T().Log("starting Hermes relayer container...") tmpDir, err := os.MkdirTemp("", "umee-e2e-testnet-hermes-") s.Require().NoError(err) s.tmpDirs = append(s.tmpDirs, tmpDir) - gaiaVal := s.chain.gaiaValidators[0] + gaiaVal := s.Chain.GaiaValidators[0] // umeeVal for the relayer needs to be a different account // than what we use for runPriceFeeder. - umeeVal := s.chain.validators[1] + umeeVal := s.Chain.Validators[1] hermesCfgPath := path.Join(tmpDir, "hermes") s.Require().NoError(os.MkdirAll(hermesCfgPath, 0o755)) @@ -740,12 +713,12 @@ func (s *IntegrationTestSuite) runIBCRelayer() { ) s.Require().NoError(err) - s.hermesResource, err = s.dkrPool.RunWithOptions( + s.HermesResource, err = s.DkrPool.RunWithOptions( &dockertest.RunOptions{ Name: "umee-gaia-relayer", Repository: "ghcr.io/umee-network/hermes-e2e", Tag: "latest", - NetworkID: s.dkrNet.Network.ID, + NetworkID: s.DkrNet.Network.ID, Mounts: []string{ fmt.Sprintf("%s/:/home/hermes", hermesCfgPath), }, @@ -754,12 +727,12 @@ func (s *IntegrationTestSuite) runIBCRelayer() { "3031/tcp": {{HostIP: "", HostPort: "3031"}}, }, Env: []string{ - fmt.Sprintf("UMEE_E2E_GAIA_CHAIN_ID=%s", gaiaChainID), - fmt.Sprintf("UMEE_E2E_UMEE_CHAIN_ID=%s", s.chain.id), + fmt.Sprintf("UMEE_E2E_GAIA_CHAIN_ID=%s", GaiaChainID), + fmt.Sprintf("UMEE_E2E_UMEE_CHAIN_ID=%s", s.Chain.ID), fmt.Sprintf("UMEE_E2E_GAIA_VAL_MNEMONIC=%s", gaiaVal.mnemonic), fmt.Sprintf("UMEE_E2E_UMEE_VAL_MNEMONIC=%s", umeeVal.mnemonic), - fmt.Sprintf("UMEE_E2E_GAIA_VAL_HOST=%s", s.gaiaResource.Container.Name[1:]), - fmt.Sprintf("UMEE_E2E_UMEE_VAL_HOST=%s", s.valResources[1].Container.Name[1:]), + fmt.Sprintf("UMEE_E2E_GAIA_VAL_HOST=%s", s.GaiaResource.Container.Name[1:]), + fmt.Sprintf("UMEE_E2E_UMEE_VAL_HOST=%s", s.ValResources[1].Container.Name[1:]), }, Entrypoint: []string{ "sh", @@ -771,7 +744,7 @@ func (s *IntegrationTestSuite) runIBCRelayer() { ) s.Require().NoError(err) - endpoint := fmt.Sprintf("http://%s/state", s.hermesResource.GetHostPort("3031/tcp")) + endpoint := fmt.Sprintf("http://%s/state", s.HermesResource.GetHostPort("3031/tcp")) s.Require().Eventually( func() bool { resp, err := http.Get(endpoint) @@ -801,32 +774,32 @@ func (s *IntegrationTestSuite) runIBCRelayer() { "hermes relayer not healthy", ) - s.T().Logf("started Hermes relayer container: %s", s.hermesResource.Container.ID) + s.T().Logf("started Hermes relayer container: %s", s.HermesResource.Container.ID) // create the client, connection and channel between the Umee and Gaia chains s.connectIBCChains() } -func (s *IntegrationTestSuite) runContractDeployment() { +func (s *E2ETestSuite) runContractDeployment() { s.T().Log("starting Gravity Bridge contract deployer container...") - resource, err := s.dkrPool.RunWithOptions( + resource, err := s.DkrPool.RunWithOptions( &dockertest.RunOptions{ Name: "gravity-contract-deployer", - NetworkID: s.dkrNet.Network.ID, + NetworkID: s.DkrNet.Network.ID, Repository: "umee-network/umeed-e2e", // NOTE: container names are prefixed with '/' - Env: []string{"PEGGO_ETH_PK=" + ethMinerPK}, + Env: []string{"PEGGO_ETH_PK=" + EthMinerPK}, Entrypoint: []string{ "peggo", "bridge", "deploy-gravity", "--eth-rpc", - fmt.Sprintf("http://%s:8545", s.ethResource.Container.Name[1:]), + fmt.Sprintf("http://%s:8545", s.EthResource.Container.Name[1:]), "--cosmos-grpc", - fmt.Sprintf("tcp://%s:9090", s.valResources[0].Container.Name[1:]), + fmt.Sprintf("tcp://%s:9090", s.ValResources[0].Container.Name[1:]), "--tendermint-rpc", - fmt.Sprintf("http://%s:26657", s.valResources[0].Container.Name[1:]), + fmt.Sprintf("http://%s:26657", s.ValResources[0].Container.Name[1:]), }, }, noRestart, @@ -840,7 +813,7 @@ func (s *IntegrationTestSuite) runContractDeployment() { for container.State.Running { time.Sleep(10 * time.Second) - container, err = s.dkrPool.Client.InspectContainer(resource.Container.ID) + container, err = s.DkrPool.Client.InspectContainer(resource.Container.ID) s.Require().NoError(err) } @@ -849,7 +822,7 @@ func (s *IntegrationTestSuite) runContractDeployment() { errBuf bytes.Buffer ) - s.Require().NoErrorf(s.dkrPool.Client.Logs( + s.Require().NoErrorf(s.DkrPool.Client.Logs( docker.LogsOptions{ Container: resource.Container.ID, OutputStream: &outBuf, @@ -881,7 +854,7 @@ func (s *IntegrationTestSuite) runContractDeployment() { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - if err := queryEthTx(ctx, s.ethClient, txHash); err != nil { + if err := s.QueryEthTx(ctx, s.EthClient, txHash); err != nil { return false } @@ -892,36 +865,36 @@ func (s *IntegrationTestSuite) runContractDeployment() { "failed to confirm Peggy contract deployment transaction", ) - s.Require().NoError(s.dkrPool.RemoveContainerByName(container.Name)) + s.Require().NoError(s.DkrPool.RemoveContainerByName(container.Name)) s.T().Logf("deployed Gravity Bridge contract: %s", gravityContractAddr) - s.gravityContractAddr = gravityContractAddr + s.GravityContractAddr = gravityContractAddr } -func (s *IntegrationTestSuite) runOrchestrators() { +func (s *E2ETestSuite) runOrchestrators() { s.T().Log("starting orchestrator containers...") - s.orchResources = make([]*dockertest.Resource, len(s.chain.validators)) - for i, orch := range s.chain.orchestrators { - resource, err := s.dkrPool.RunWithOptions( + s.OrchResources = make([]*dockertest.Resource, len(s.Chain.Validators)) + for i, orch := range s.Chain.Orchestrators { + resource, err := s.DkrPool.RunWithOptions( &dockertest.RunOptions{ - Name: s.chain.orchestrators[i].instanceName(), - NetworkID: s.dkrNet.Network.ID, + Name: s.Chain.Orchestrators[i].instanceName(), + NetworkID: s.DkrNet.Network.ID, Repository: "umee-network/umeed-e2e", - Env: []string{"PEGGO_ETH_PK=" + orch.ethereumKey.privateKey}, + Env: []string{"PEGGO_ETH_PK=" + orch.EthereumKey.PrivateKey}, // NOTE: container names are prefixed with '/' Entrypoint: []string{ "peggo", "orchestrator", - s.gravityContractAddr, + s.GravityContractAddr, "--eth-rpc", - fmt.Sprintf("http://%s:8545", s.ethResource.Container.Name[1:]), + fmt.Sprintf("http://%s:8545", s.EthResource.Container.Name[1:]), "--cosmos-chain-id", - s.chain.id, + s.Chain.ID, "--cosmos-grpc", - fmt.Sprintf("tcp://%s:9090", s.valResources[i].Container.Name[1:]), + fmt.Sprintf("tcp://%s:9090", s.ValResources[i].Container.Name[1:]), "--tendermint-rpc", - fmt.Sprintf("http://%s:26657", s.valResources[i].Container.Name[1:]), + fmt.Sprintf("http://%s:26657", s.ValResources[i].Container.Name[1:]), "--cosmos-gas-prices", minGasPrice, "--cosmos-from", @@ -933,19 +906,19 @@ func (s *IntegrationTestSuite) runOrchestrators() { "--relayer-loop-multiplier=1.0", "--requester-loop-multiplier=1.0", "--cosmos-pk", - hexutil.Encode(s.chain.orchestrators[i].privateKey.Bytes()), + hexutil.Encode(s.Chain.Orchestrators[i].PrivateKey.Bytes()), }, }, noRestart, ) s.Require().NoError(err) - s.orchResources[i] = resource + s.OrchResources[i] = resource s.T().Logf("started orchestrator container: %s", resource.Container.ID) } match := "oracle sent set of claims successfully" - for _, resource := range s.orchResources { + for _, resource := range s.OrchResources { s.T().Logf("waiting for orchestrator to be healthy: %s", resource.Container.ID) var ( @@ -955,7 +928,7 @@ func (s *IntegrationTestSuite) runOrchestrators() { s.Require().Eventuallyf( func() bool { - err := s.dkrPool.Client.Logs( + err := s.DkrPool.Client.Logs( docker.LogsOptions{ Container: resource.Container.ID, OutputStream: &outBuf, @@ -978,33 +951,33 @@ func (s *IntegrationTestSuite) runOrchestrators() { } } -func (s *IntegrationTestSuite) runPriceFeeder() { +func (s *E2ETestSuite) runPriceFeeder() { s.T().Log("starting price-feeder container...") - umeeVal := s.chain.validators[2] - umeeValAddr, err := umeeVal.keyInfo.GetAddress() + umeeVal := s.Chain.Validators[2] + umeeValAddr, err := umeeVal.KeyInfo.GetAddress() s.Require().NoError(err) grpcEndpoint := fmt.Sprintf("tcp://%s:%s", umeeVal.instanceName(), "9090") tmrpcEndpoint := fmt.Sprintf("http://%s:%s", umeeVal.instanceName(), "26657") - s.priceFeederResource, err = s.dkrPool.RunWithOptions( + s.priceFeederResource, err = s.DkrPool.RunWithOptions( &dockertest.RunOptions{ Name: "umee-price-feeder", - NetworkID: s.dkrNet.Network.ID, - Repository: priceFeederContainerRepo, + NetworkID: s.DkrNet.Network.ID, + Repository: PriceFeederContainerRepo, Mounts: []string{ fmt.Sprintf("%s/:/root/.umee", umeeVal.configDir()), }, PortBindings: map[docker.Port][]docker.PortBinding{ - priceFeederServerPort: {{HostIP: "", HostPort: "7171"}}, + PriceFeederServerPort: {{HostIP: "", HostPort: "7171"}}, }, Env: []string{ fmt.Sprintf("PRICE_FEEDER_PASS=%s", keyringPassphrase), fmt.Sprintf("ACCOUNT_ADDRESS=%s", umeeValAddr), fmt.Sprintf("ACCOUNT_VALIDATOR=%s", sdk.ValAddress(umeeValAddr)), fmt.Sprintf("KEYRING_DIR=%s", "/root/.umee"), - fmt.Sprintf("ACCOUNT_CHAIN_ID=%s", s.chain.id), + fmt.Sprintf("ACCOUNT_CHAIN_ID=%s", s.Chain.ID), fmt.Sprintf("RPC_GRPC_ENDPOINT=%s", grpcEndpoint), fmt.Sprintf("RPC_TMRPC_ENDPOINT=%s", tmrpcEndpoint), }, @@ -1017,7 +990,7 @@ func (s *IntegrationTestSuite) runPriceFeeder() { ) s.Require().NoError(err) - endpoint := fmt.Sprintf("http://%s/api/v1/prices", s.priceFeederResource.GetHostPort(priceFeederServerPort)) + endpoint := fmt.Sprintf("http://%s/api/v1/prices", s.priceFeederResource.GetHostPort(PriceFeederServerPort)) checkHealth := func() bool { resp, err := http.Get(endpoint) @@ -1050,7 +1023,7 @@ func (s *IntegrationTestSuite) runPriceFeeder() { } isHealthy := false - for i := 0; i < priceFeederMaxStartupTime; i++ { + for i := 0; i < PriceFeederMaxStartupTime; i++ { isHealthy = checkHealth() if isHealthy { break @@ -1059,7 +1032,7 @@ func (s *IntegrationTestSuite) runPriceFeeder() { } if !isHealthy { - err := s.dkrPool.Client.Logs(docker.LogsOptions{ + err := s.DkrPool.Client.Logs(docker.LogsOptions{ Container: s.priceFeederResource.Container.ID, OutputStream: os.Stdout, ErrorStream: os.Stderr, @@ -1077,16 +1050,16 @@ func (s *IntegrationTestSuite) runPriceFeeder() { s.T().Logf("started price-feeder container: %s", s.priceFeederResource.Container.ID) } -func (s *IntegrationTestSuite) initUmeeClient() { +func (s *E2ETestSuite) initUmeeClient() { var err error mnemonics := make([]string, 0) - for _, v := range s.chain.validators { + for _, v := range s.Chain.Validators { mnemonics = append(mnemonics, v.mnemonic) } ecfg := app.MakeEncodingConfig() - s.umee, err = client.NewClient( - s.chain.id, + s.Umee, err = client.NewClient( + s.Chain.ID, "tcp://localhost:26657", "tcp://localhost:9090", mnemonics, @@ -1096,6 +1069,55 @@ func (s *IntegrationTestSuite) initUmeeClient() { s.Require().NoError(err) } +func (s *E2ETestSuite) connectIBCChains() { + s.T().Logf("connecting %s and %s chains via IBC", s.Chain.ID, GaiaChainID) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + exec, err := s.DkrPool.Client.CreateExec(docker.CreateExecOptions{ + Context: ctx, + AttachStdout: true, + AttachStderr: true, + Container: s.HermesResource.Container.ID, + User: "root", + Cmd: []string{ + "hermes", + "create", + "channel", + s.Chain.ID, + GaiaChainID, + "--port-a=transfer", + "--port-b=transfer", + }, + }) + s.Require().NoError(err) + + var ( + outBuf bytes.Buffer + errBuf bytes.Buffer + ) + + err = s.DkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ + Context: ctx, + Detach: false, + OutputStream: &outBuf, + ErrorStream: &errBuf, + }) + s.Require().NoErrorf( + err, + "failed connect chains; stdout: %s, stderr: %s", outBuf.String(), errBuf.String(), + ) + + s.Require().Containsf( + errBuf.String(), + "successfully opened init channel", + "failed to connect chains via IBC: %s", errBuf.String(), + ) + + s.T().Logf("connected %s and %s chains via IBC", s.Chain.ID, GaiaChainID) +} + func noRestart(config *docker.HostConfig) { // in this case we don't want the nodes to restart on failure config.RestartPolicy = docker.RestartPolicy{ diff --git a/tests/e2e/e2e_util_test.go b/tests/e2e/setup/utils.go similarity index 66% rename from tests/e2e/e2e_util_test.go rename to tests/e2e/setup/utils.go index 904b24bd3e..19aea88a33 100644 --- a/tests/e2e/e2e_util_test.go +++ b/tests/e2e/setup/utils.go @@ -1,4 +1,4 @@ -package e2e +package e2esetup import ( "bytes" @@ -14,7 +14,9 @@ import ( gravitytypes "github.com/Gravity-Bridge/Gravity-Bridge/module/x/gravity/types" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec/unknownproto" sdk "github.com/cosmos/cosmos-sdk/types" + sdktx "github.com/cosmos/cosmos-sdk/types/tx" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/ethereum/go-ethereum" ethcmn "github.com/ethereum/go-ethereum/common" @@ -26,41 +28,41 @@ import ( "github.com/umee-network/umee/v4/x/uibc" ) -func (s *IntegrationTestSuite) umeeREST() string { - return fmt.Sprintf("http://%s", s.valResources[0].GetHostPort("1317/tcp")) +func (s *E2ETestSuite) UmeeREST() string { + return fmt.Sprintf("http://%s", s.ValResources[0].GetHostPort("1317/tcp")) } -func (s *IntegrationTestSuite) gaiaREST() string { - return fmt.Sprintf("http://%s", s.gaiaResource.GetHostPort("1317/tcp")) +func (s *E2ETestSuite) GaiaREST() string { + return fmt.Sprintf("http://%s", s.GaiaResource.GetHostPort("1317/tcp")) } -func (s *IntegrationTestSuite) deployERC20Token(baseDenom string) string { +func (s *E2ETestSuite) DeployERC20Token(baseDenom string) string { s.T().Logf("deploying ERC20 token contract: %s", baseDenom) ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - exec, err := s.dkrPool.Client.CreateExec(docker.CreateExecOptions{ + exec, err := s.DkrPool.Client.CreateExec(docker.CreateExecOptions{ Context: ctx, AttachStdout: true, AttachStderr: true, - Container: s.orchResources[0].Container.ID, + Container: s.OrchResources[0].Container.ID, User: "root", - Env: []string{"PEGGO_ETH_PK=" + ethMinerPK}, + Env: []string{"PEGGO_ETH_PK=" + EthMinerPK}, Cmd: []string{ "peggo", "bridge", "deploy-erc20", - s.gravityContractAddr, + s.GravityContractAddr, baseDenom, "--eth-rpc", - fmt.Sprintf("http://%s:8545", s.ethResource.Container.Name[1:]), + fmt.Sprintf("http://%s:8545", s.EthResource.Container.Name[1:]), "--cosmos-chain-id", - s.chain.id, + s.Chain.ID, "--cosmos-grpc", - fmt.Sprintf("tcp://%s:9090", s.valResources[0].Container.Name[1:]), + fmt.Sprintf("tcp://%s:9090", s.ValResources[0].Container.Name[1:]), "--tendermint-rpc", - fmt.Sprintf("http://%s:26657", s.valResources[0].Container.Name[1:]), + fmt.Sprintf("http://%s:26657", s.ValResources[0].Container.Name[1:]), }, }) s.Require().NoError(err) @@ -70,7 +72,7 @@ func (s *IntegrationTestSuite) deployERC20Token(baseDenom string) string { errBuf bytes.Buffer ) - err = s.dkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ + err = s.DkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ Context: ctx, Detach: false, OutputStream: &outBuf, @@ -93,7 +95,7 @@ func (s *IntegrationTestSuite) deployERC20Token(baseDenom string) string { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - if err := queryEthTx(ctx, s.ethClient, txHash); err != nil { + if err := s.QueryEthTx(ctx, s.EthClient, txHash); err != nil { return false } @@ -104,12 +106,12 @@ func (s *IntegrationTestSuite) deployERC20Token(baseDenom string) string { "failed to confirm ERC20 deployment transaction", ) - umeeAPIEndpoint := fmt.Sprintf("http://%s", s.valResources[0].GetHostPort("1317/tcp")) + umeeAPIEndpoint := fmt.Sprintf("http://%s", s.ValResources[0].GetHostPort("1317/tcp")) var erc20Addr string s.Require().Eventually( func() bool { - addr, cosmosNative, err := queryDenomToERC20(umeeAPIEndpoint, baseDenom) + addr, cosmosNative, err := s.QueryDenomToERC20(umeeAPIEndpoint, baseDenom) if err != nil { return false } @@ -131,11 +133,11 @@ func (s *IntegrationTestSuite) deployERC20Token(baseDenom string) string { return erc20Addr } -func (s *IntegrationTestSuite) sendFromUmeeToEth(valIdx int, ethDest, amount, umeeFee, gravityFee string) { +func (s *E2ETestSuite) SendFromUmeeToEth(valIdx int, ethDest, amount, umeeFee, gravityFee string) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - valAddr, err := s.chain.validators[valIdx].keyInfo.GetAddress() + valAddr, err := s.Chain.Validators[valIdx].KeyInfo.GetAddress() s.Require().NoError(err) s.T().Logf( @@ -143,11 +145,11 @@ func (s *IntegrationTestSuite) sendFromUmeeToEth(valIdx int, ethDest, amount, um valAddr, ethDest, amount, umeeFee, gravityFee, ) - exec, err := s.dkrPool.Client.CreateExec(docker.CreateExecOptions{ + exec, err := s.DkrPool.Client.CreateExec(docker.CreateExecOptions{ Context: ctx, AttachStdout: true, AttachStderr: true, - Container: s.valResources[valIdx].Container.ID, + Container: s.ValResources[valIdx].Container.ID, User: "root", Cmd: []string{ "umeed", @@ -157,8 +159,8 @@ func (s *IntegrationTestSuite) sendFromUmeeToEth(valIdx int, ethDest, amount, um ethDest, amount, gravityFee, - fmt.Sprintf("--%s=%s", flags.FlagFrom, s.chain.validators[valIdx].keyInfo.Name), - fmt.Sprintf("--%s=%s", flags.FlagChainID, s.chain.id), + fmt.Sprintf("--%s=%s", flags.FlagFrom, s.Chain.Validators[valIdx].KeyInfo.Name), + fmt.Sprintf("--%s=%s", flags.FlagChainID, s.Chain.ID), fmt.Sprintf("--%s=%s", flags.FlagFees, umeeFee), "--keyring-backend=test", "--broadcast-mode=sync", @@ -173,7 +175,7 @@ func (s *IntegrationTestSuite) sendFromUmeeToEth(valIdx int, ethDest, amount, um errBuf bytes.Buffer ) - err = s.dkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ + err = s.DkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ Context: ctx, Detach: false, OutputStream: &outBuf, @@ -184,12 +186,12 @@ func (s *IntegrationTestSuite) sendFromUmeeToEth(valIdx int, ethDest, amount, um var broadcastResp map[string]interface{} s.Require().NoError(json.Unmarshal(outBuf.Bytes(), &broadcastResp), outBuf.String()) - endpoint := fmt.Sprintf("http://%s", s.valResources[valIdx].GetHostPort("1317/tcp")) + endpoint := fmt.Sprintf("http://%s", s.ValResources[valIdx].GetHostPort("1317/tcp")) txHash := broadcastResp["txhash"].(string) s.Require().Eventuallyf( func() bool { - return queryUmeeTx(endpoint, txHash) == nil + return s.QueryUmeeTx(endpoint, txHash) == nil }, 2*time.Minute, 5*time.Second, @@ -198,7 +200,7 @@ func (s *IntegrationTestSuite) sendFromUmeeToEth(valIdx int, ethDest, amount, um ) } -func (s *IntegrationTestSuite) sendFromUmeeToEthCheck( +func (s *E2ETestSuite) SendFromUmeeToEthCheck( umeeValIdxSender, orchestratorIdxReceiver int, ethTokenAddr string, @@ -212,19 +214,19 @@ func (s *IntegrationTestSuite) sendFromUmeeToEthCheck( allSameDenom := strings.EqualFold(amount.Denom, umeeFee.Denom) && strings.EqualFold(amount.Denom, gravityFee.Denom) var umeeFeeBalanceBeforeSend sdk.Coin if !allSameDenom { - umeeFeeBalanceBeforeSend, _ = s.queryUmeeBalance(umeeValIdxSender, umeeFee.Denom) + umeeFeeBalanceBeforeSend, _ = s.QueryUmeeBalance(umeeValIdxSender, umeeFee.Denom) } - umeeAmountBalanceBeforeSend, ethBalanceBeforeSend, _, ethAddr := s.queryUmeeEthBalance(umeeValIdxSender, orchestratorIdxReceiver, amount.Denom, ethTokenAddr) // 3300000000 + umeeAmountBalanceBeforeSend, ethBalanceBeforeSend, _, ethAddr := s.QueryUmeeEthBalance(umeeValIdxSender, orchestratorIdxReceiver, amount.Denom, ethTokenAddr) // 3300000000 - s.sendFromUmeeToEth(umeeValIdxSender, ethAddr, amount.String(), umeeFee.String(), gravityFee.String()) - umeeAmountBalanceAfterSend, ethBalanceAfterSend, _, _ := s.queryUmeeEthBalance(umeeValIdxSender, orchestratorIdxReceiver, amount.Denom, ethTokenAddr) // 3299999693 + s.SendFromUmeeToEth(umeeValIdxSender, ethAddr, amount.String(), umeeFee.String(), gravityFee.String()) + umeeAmountBalanceAfterSend, ethBalanceAfterSend, _, _ := s.QueryUmeeEthBalance(umeeValIdxSender, orchestratorIdxReceiver, amount.Denom, ethTokenAddr) // 3299999693 if allSameDenom { s.Require().Equal(umeeAmountBalanceBeforeSend.Sub(amount).Sub(umeeFee).Sub(gravityFee).Amount.Int64(), umeeAmountBalanceAfterSend.Amount.Int64()) } else { // the umeeFee and amount have different denom s.Require().Equal(umeeAmountBalanceBeforeSend.Sub(amount).Sub(gravityFee).Amount.Int64(), umeeAmountBalanceAfterSend.Amount.Int64()) - umeeFeeBalanceAfterSend, _ := s.queryUmeeBalance(umeeValIdxSender, umeeFee.Denom) + umeeFeeBalanceAfterSend, _ := s.QueryUmeeBalance(umeeValIdxSender, umeeFee.Denom) s.Require().Equal(umeeFeeBalanceBeforeSend.Sub(umeeFee).Amount.Int64(), umeeFeeBalanceAfterSend.Amount.Int64()) } @@ -237,7 +239,7 @@ func (s *IntegrationTestSuite) sendFromUmeeToEthCheck( ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() - b, err := queryEthTokenBalance(ctx, s.ethClient, ethTokenAddr, ethAddr) + b, err := s.QueryEthTokenBalance(ctx, s.EthClient, ethTokenAddr, ethAddr) if err != nil { return false } @@ -254,26 +256,26 @@ func (s *IntegrationTestSuite) sendFromUmeeToEthCheck( ) } -func (s *IntegrationTestSuite) sendFromEthToUmeeCheck( +func (s *E2ETestSuite) SendFromEthToUmeeCheck( orchestratorIdxSender, umeeValIdxReceiver int, ethTokenAddr, umeeTokenDenom string, amount uint64, ) { - umeeBalanceBeforeSend, ethBalanceBeforeSend, umeeAddr, _ := s.queryUmeeEthBalance(umeeValIdxReceiver, orchestratorIdxSender, umeeTokenDenom, ethTokenAddr) - s.sendFromEthToUmee(orchestratorIdxSender, ethTokenAddr, umeeAddr, fmt.Sprintf("%d", amount)) - umeeBalanceAfterSend, ethBalanceAfterSend, _, _ := s.queryUmeeEthBalance(umeeValIdxReceiver, orchestratorIdxSender, umeeTokenDenom, ethTokenAddr) + umeeBalanceBeforeSend, ethBalanceBeforeSend, umeeAddr, _ := s.QueryUmeeEthBalance(umeeValIdxReceiver, orchestratorIdxSender, umeeTokenDenom, ethTokenAddr) + s.SendFromEthToUmee(orchestratorIdxSender, ethTokenAddr, umeeAddr, fmt.Sprintf("%d", amount)) + umeeBalanceAfterSend, ethBalanceAfterSend, _, _ := s.QueryUmeeEthBalance(umeeValIdxReceiver, orchestratorIdxSender, umeeTokenDenom, ethTokenAddr) s.Require().Equal(ethBalanceBeforeSend-int64(amount), ethBalanceAfterSend) - umeeEndpoint := fmt.Sprintf("http://%s", s.valResources[umeeValIdxReceiver].GetHostPort("1317/tcp")) + umeeEndpoint := fmt.Sprintf("http://%s", s.ValResources[umeeValIdxReceiver].GetHostPort("1317/tcp")) // require the original sender's (validator) balance increased // peggo needs time to read the event and cross the tx umeeLatestBalance := umeeBalanceAfterSend.Amount s.Require().Eventuallyf( func() bool { - b, err := queryUmeeDenomBalance(umeeEndpoint, umeeAddr, umeeTokenDenom) + b, err := s.QueryUmeeDenomBalance(umeeEndpoint, umeeAddr, umeeTokenDenom) if err != nil { s.T().Logf("Error at sendFromEthToUmeeCheck.queryUmeeDenomBalance %+v", err) return false @@ -289,38 +291,38 @@ func (s *IntegrationTestSuite) sendFromEthToUmeeCheck( ) } -func (s *IntegrationTestSuite) sendFromEthToUmee(valIdx int, tokenAddr, toUmeeAddr, amount string) { +func (s *E2ETestSuite) SendFromEthToUmee(valIdx int, tokenAddr, toUmeeAddr, amount string) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() s.T().Logf( "sending tokens from Ethereum to Umee; from: %s, to: %s, amount: %s, contract: %s", - s.chain.orchestrators[valIdx].ethereumKey.address, toUmeeAddr, amount, tokenAddr, + s.Chain.Orchestrators[valIdx].EthereumKey.Address, toUmeeAddr, amount, tokenAddr, ) - exec, err := s.dkrPool.Client.CreateExec(docker.CreateExecOptions{ + exec, err := s.DkrPool.Client.CreateExec(docker.CreateExecOptions{ Context: ctx, AttachStdout: true, AttachStderr: true, - Container: s.orchResources[valIdx].Container.ID, + Container: s.OrchResources[valIdx].Container.ID, User: "root", - Env: []string{"PEGGO_ETH_PK=" + s.chain.orchestrators[valIdx].ethereumKey.privateKey}, + Env: []string{"PEGGO_ETH_PK=" + s.Chain.Orchestrators[valIdx].EthereumKey.PrivateKey}, Cmd: []string{ "peggo", "bridge", "send-to-cosmos", - s.gravityContractAddr, + s.GravityContractAddr, tokenAddr, toUmeeAddr, amount, "--eth-rpc", - fmt.Sprintf("http://%s:8545", s.ethResource.Container.Name[1:]), + fmt.Sprintf("http://%s:8545", s.EthResource.Container.Name[1:]), "--cosmos-chain-id", - s.chain.id, + s.Chain.ID, "--cosmos-grpc", - fmt.Sprintf("tcp://%s:9090", s.valResources[valIdx].Container.Name[1:]), + fmt.Sprintf("tcp://%s:9090", s.ValResources[valIdx].Container.Name[1:]), "--tendermint-rpc", - fmt.Sprintf("http://%s:26657", s.valResources[valIdx].Container.Name[1:]), + fmt.Sprintf("http://%s:26657", s.ValResources[valIdx].Container.Name[1:]), }, }) s.Require().NoError(err) @@ -330,7 +332,7 @@ func (s *IntegrationTestSuite) sendFromEthToUmee(valIdx int, tokenAddr, toUmeeAd errBuf bytes.Buffer ) - err = s.dkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ + err = s.DkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ Context: ctx, Detach: false, OutputStream: &outBuf, @@ -347,7 +349,7 @@ func (s *IntegrationTestSuite) sendFromEthToUmee(valIdx int, tokenAddr, toUmeeAd s.Require().Eventuallyf( func() bool { - return queryEthTx(ctx, s.ethClient, txHash) == nil + return s.QueryEthTx(ctx, s.EthClient, txHash) == nil }, 5*time.Minute, 5*time.Second, @@ -356,56 +358,7 @@ func (s *IntegrationTestSuite) sendFromEthToUmee(valIdx int, tokenAddr, toUmeeAd ) } -func (s *IntegrationTestSuite) connectIBCChains() { - s.T().Logf("connecting %s and %s chains via IBC", s.chain.id, gaiaChainID) - - ctx, cancel := context.WithTimeout(context.Background(), time.Minute) - defer cancel() - - exec, err := s.dkrPool.Client.CreateExec(docker.CreateExecOptions{ - Context: ctx, - AttachStdout: true, - AttachStderr: true, - Container: s.hermesResource.Container.ID, - User: "root", - Cmd: []string{ - "hermes", - "create", - "channel", - s.chain.id, - gaiaChainID, - "--port-a=transfer", - "--port-b=transfer", - }, - }) - s.Require().NoError(err) - - var ( - outBuf bytes.Buffer - errBuf bytes.Buffer - ) - - err = s.dkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ - Context: ctx, - Detach: false, - OutputStream: &outBuf, - ErrorStream: &errBuf, - }) - s.Require().NoErrorf( - err, - "failed connect chains; stdout: %s, stderr: %s", outBuf.String(), errBuf.String(), - ) - - s.Require().Containsf( - errBuf.String(), - "successfully opened init channel", - "failed to connect chains via IBC: %s", errBuf.String(), - ) - - s.T().Logf("connected %s and %s chains via IBC", s.chain.id, gaiaChainID) -} - -func (s *IntegrationTestSuite) sendIBC(srcChainID, dstChainID, recipient string, token sdk.Coin) { +func (s *E2ETestSuite) SendIBC(srcChainID, dstChainID, recipient string, token sdk.Coin) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() @@ -428,11 +381,11 @@ func (s *IntegrationTestSuite) sendIBC(srcChainID, dstChainID, recipient string, cmd = append(cmd, fmt.Sprintf("--receiver=%s", recipient)) } - exec, err := s.dkrPool.Client.CreateExec(docker.CreateExecOptions{ + exec, err := s.DkrPool.Client.CreateExec(docker.CreateExecOptions{ Context: ctx, AttachStdout: true, AttachStderr: true, - Container: s.hermesResource.Container.ID, + Container: s.HermesResource.Container.ID, Cmd: cmd, }) s.Require().NoError(err) @@ -442,7 +395,7 @@ func (s *IntegrationTestSuite) sendIBC(srcChainID, dstChainID, recipient string, errBuf bytes.Buffer ) - err = s.dkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ + err = s.DkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ Context: ctx, Detach: false, OutputStream: &outBuf, @@ -458,10 +411,10 @@ func (s *IntegrationTestSuite) sendIBC(srcChainID, dstChainID, recipient string, time.Sleep(time.Second * 12) } -// queryREST make http query to grpc-web endpoint and tries to decode valPtr using proto-JSON +// QueryREST make http query to grpc-web endpoint and tries to decode valPtr using proto-JSON // decoder if valPtr implements proto.Message. Otherwise standard JSON decoder is used. // valPtr must be a pointer. -func queryREST(endpoint string, valPtr interface{}) error { +func (s *E2ETestSuite) QueryREST(endpoint string, valPtr interface{}) error { resp, err := http.Get(endpoint) if err != nil { return fmt.Errorf("failed to execute HTTP request: %w", err) @@ -477,7 +430,7 @@ func queryREST(endpoint string, valPtr interface{}) error { if err != nil { return fmt.Errorf("failed to read response body: %w, endpoint: %s", err, endpoint) } - if err = cdc.UnmarshalJSON(bz, valProto); err != nil { + if err = Cdc.UnmarshalJSON(bz, valProto); err != nil { return fmt.Errorf("failed to protoJSON.decode response body: %w, endpoint: %s", err, endpoint) } } else { @@ -489,10 +442,10 @@ func queryREST(endpoint string, valPtr interface{}) error { return nil } -func queryUmeeTx(endpoint, txHash string) error { +func (s *E2ETestSuite) QueryUmeeTx(endpoint, txHash string) error { endpoint = fmt.Sprintf("%s/cosmos/tx/v1beta1/txs/%s", endpoint, txHash) var result map[string]interface{} - if err := queryREST(endpoint, &result); err != nil { + if err := s.QueryREST(endpoint, &result); err != nil { return err } @@ -503,77 +456,77 @@ func queryUmeeTx(endpoint, txHash string) error { return nil } -func queryUmeeAllBalances(endpoint, addr string) (sdk.Coins, error) { +func (s *E2ETestSuite) QueryUmeeAllBalances(endpoint, addr string) (sdk.Coins, error) { endpoint = fmt.Sprintf("%s/cosmos/bank/v1beta1/balances/%s", endpoint, addr) var balancesResp banktypes.QueryAllBalancesResponse - if err := queryREST(endpoint, &balancesResp); err != nil { + if err := s.QueryREST(endpoint, &balancesResp); err != nil { return nil, err } return balancesResp.Balances, nil } -func queryTotalSupply(endpoint string) (sdk.Coins, error) { +func (s *E2ETestSuite) QueryTotalSupply(endpoint string) (sdk.Coins, error) { endpoint = fmt.Sprintf("%s/cosmos/bank/v1beta1/supply", endpoint) var balancesResp banktypes.QueryTotalSupplyResponse - if err := queryREST(endpoint, &balancesResp); err != nil { + if err := s.QueryREST(endpoint, &balancesResp); err != nil { return nil, err } return balancesResp.Supply, nil } -func queryExchangeRate(endpoint, denom string) (sdk.DecCoins, error) { +func (s *E2ETestSuite) QueryExchangeRate(endpoint, denom string) (sdk.DecCoins, error) { endpoint = fmt.Sprintf("%s/umee/oracle/v1/denoms/exchange_rates/%s", endpoint, denom) var resp oracletypes.QueryExchangeRatesResponse - if err := queryREST(endpoint, &resp); err != nil { + if err := s.QueryREST(endpoint, &resp); err != nil { return nil, err } return resp.ExchangeRates, nil } -func queryHistAvgPrice(endpoint, denom string) (sdk.Dec, error) { +func (s *E2ETestSuite) QueryHistAvgPrice(endpoint, denom string) (sdk.Dec, error) { endpoint = fmt.Sprintf("%s/umee/historacle/v1/avg_price/%s", endpoint, strings.ToUpper(denom)) var resp oracletypes.QueryAvgPriceResponse - if err := queryREST(endpoint, &resp); err != nil { + if err := s.QueryREST(endpoint, &resp); err != nil { return sdk.Dec{}, err } return resp.Price, nil } -func queryOutflows(endpoint, denom string) (sdk.Dec, error) { +func (s *E2ETestSuite) QueryOutflows(endpoint, denom string) (sdk.Dec, error) { endpoint = fmt.Sprintf("%s/umee/uibc/v1/outflows?denom=%s", endpoint, denom) var resp uibc.QueryOutflowsResponse - if err := queryREST(endpoint, &resp); err != nil { + if err := s.QueryREST(endpoint, &resp); err != nil { return sdk.Dec{}, err } return resp.Amount, nil } -func queryUmeeDenomBalance(endpoint, addr, denom string) (sdk.Coin, error) { +func (s *E2ETestSuite) QueryUmeeDenomBalance(endpoint, addr, denom string) (sdk.Coin, error) { endpoint = fmt.Sprintf("%s/cosmos/bank/v1beta1/balances/%s/by_denom?denom=%s", endpoint, addr, denom) var resp banktypes.QueryBalanceResponse - if err := queryREST(endpoint, &resp); err != nil { + if err := s.QueryREST(endpoint, &resp); err != nil { return sdk.Coin{}, err } return *resp.Balance, nil } -func queryDenomToERC20(endpoint, denom string) (string, bool, error) { +func (s *E2ETestSuite) QueryDenomToERC20(endpoint, denom string) (string, bool, error) { endpoint = fmt.Sprintf("%s/gravity/v1beta/cosmos_originated/denom_to_erc20?denom=%s", endpoint, denom) var resp gravitytypes.QueryDenomToERC20Response - if err := queryREST(endpoint, &resp); err != nil { + if err := s.QueryREST(endpoint, &resp); err != nil { return "", false, err } return resp.Erc20, resp.CosmosOriginated, nil } -func queryEthTx(ctx context.Context, c *ethclient.Client, txHash string) error { +func (s *E2ETestSuite) QueryEthTx(ctx context.Context, c *ethclient.Client, txHash string) error { _, pending, err := c.TransactionByHash(ctx, ethcmn.HexToHash(txHash)) if err != nil { return err @@ -585,8 +538,8 @@ func queryEthTx(ctx context.Context, c *ethclient.Client, txHash string) error { return nil } -func queryEthTokenBalance(ctx context.Context, c *ethclient.Client, contractAddr, recipientAddr string) (int64, error) { - data, err := ethABI.Pack(abiMethodNameBalanceOf, ethcmn.HexToAddress(recipientAddr)) +func (s *E2ETestSuite) QueryEthTokenBalance(ctx context.Context, c *ethclient.Client, contractAddr, recipientAddr string) (int64, error) { + data, err := EthABI.Pack(AbiMethodNameBalanceOf, ethcmn.HexToAddress(recipientAddr)) if err != nil { return 0, fmt.Errorf("failed to pack ABI method call: %w", err) } @@ -610,16 +563,16 @@ func queryEthTokenBalance(ctx context.Context, c *ethclient.Client, contractAddr return balance, nil } -func (s *IntegrationTestSuite) queryUmeeBalance( +func (s *E2ETestSuite) QueryUmeeBalance( umeeValIdx int, umeeTokenDenom string, ) (umeeBalance sdk.Coin, umeeAddr string) { - umeeEndpoint := fmt.Sprintf("http://%s", s.valResources[umeeValIdx].GetHostPort("1317/tcp")) - umeeAddress, err := s.chain.validators[umeeValIdx].keyInfo.GetAddress() + umeeEndpoint := fmt.Sprintf("http://%s", s.ValResources[umeeValIdx].GetHostPort("1317/tcp")) + umeeAddress, err := s.Chain.Validators[umeeValIdx].KeyInfo.GetAddress() s.Require().NoError(err) umeeAddr = umeeAddress.String() - umeeBalance, err = queryUmeeDenomBalance(umeeEndpoint, umeeAddr, umeeTokenDenom) + umeeBalance, err = s.QueryUmeeDenomBalance(umeeEndpoint, umeeAddr, umeeTokenDenom) s.Require().NoError(err) s.T().Logf( "Umee Balance of tokens validator; index: %d, addr: %s, amount: %s, denom: %s", @@ -629,19 +582,19 @@ func (s *IntegrationTestSuite) queryUmeeBalance( return umeeBalance, umeeAddr } -func (s *IntegrationTestSuite) queryUmeeEthBalance( +func (s *E2ETestSuite) QueryUmeeEthBalance( umeeValIdx, orchestratorIdx int, umeeTokenDenom, ethTokenAddr string, ) (umeeBalance sdk.Coin, ethBalance int64, umeeAddr, ethAddr string) { - umeeBalance, umeeAddr = s.queryUmeeBalance(umeeValIdx, umeeTokenDenom) + umeeBalance, umeeAddr = s.QueryUmeeBalance(umeeValIdx, umeeTokenDenom) ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() - ethAddr = s.chain.orchestrators[orchestratorIdx].ethereumKey.address + ethAddr = s.Chain.Orchestrators[orchestratorIdx].EthereumKey.Address - ethBalance, err := queryEthTokenBalance(ctx, s.ethClient, ethTokenAddr, ethAddr) + ethBalance, err := s.QueryEthTokenBalance(ctx, s.EthClient, ethTokenAddr, ethAddr) s.Require().NoError(err) s.T().Logf( "ETh Balance of tokens; index: %d, addr: %s, amount: %d, denom: %s, erc20Addr: %s", @@ -650,3 +603,40 @@ func (s *IntegrationTestSuite) queryUmeeEthBalance( return umeeBalance, ethBalance, umeeAddr, ethAddr } + +func decodeTx(txBytes []byte) (*sdktx.Tx, error) { + var raw sdktx.TxRaw + + // reject all unknown proto fields in the root TxRaw + err := unknownproto.RejectUnknownFieldsStrict(txBytes, &raw, encodingConfig.InterfaceRegistry) + if err != nil { + return nil, fmt.Errorf("failed to reject unknown fields: %w", err) + } + + if err := Cdc.Unmarshal(txBytes, &raw); err != nil { + return nil, err + } + + var body sdktx.TxBody + if err := Cdc.Unmarshal(raw.BodyBytes, &body); err != nil { + return nil, fmt.Errorf("failed to decode tx: %w", err) + } + + var authInfo sdktx.AuthInfo + + // reject all unknown proto fields in AuthInfo + err = unknownproto.RejectUnknownFieldsStrict(raw.AuthInfoBytes, &authInfo, encodingConfig.InterfaceRegistry) + if err != nil { + return nil, fmt.Errorf("failed to reject unknown fields: %w", err) + } + + if err := Cdc.Unmarshal(raw.AuthInfoBytes, &authInfo); err != nil { + return nil, fmt.Errorf("failed to decode auth info: %w", err) + } + + return &sdktx.Tx{ + Body: &body, + AuthInfo: &authInfo, + Signatures: raw.Signatures, + }, nil +} diff --git a/tests/e2e/validator.go b/tests/e2e/setup/validator.go similarity index 96% rename from tests/e2e/validator.go rename to tests/e2e/setup/validator.go index 57ced84418..722bcdbfae 100644 --- a/tests/e2e/validator.go +++ b/tests/e2e/setup/validator.go @@ -1,4 +1,4 @@ -package e2e +package e2esetup import ( "encoding/json" @@ -34,7 +34,7 @@ type validator struct { index int moniker string mnemonic string - keyInfo keyring.Record + KeyInfo keyring.Record privateKey cryptotypes.PrivKey consensusKey privval.FilePVKey nodeKey p2p.NodeKey @@ -69,12 +69,12 @@ func (v *validator) init() error { return err } - appState, err := json.MarshalIndent(umeeapp.ModuleBasics.DefaultGenesis(cdc), "", " ") + appState, err := json.MarshalIndent(umeeapp.ModuleBasics.DefaultGenesis(Cdc), "", " ") if err != nil { return fmt.Errorf("failed to JSON encode app genesis state: %w", err) } - genDoc.ChainID = v.chain.id + genDoc.ChainID = v.chain.ID genDoc.Validators = nil genDoc.AppState = appState @@ -126,7 +126,7 @@ func (v *validator) createConsensusKey() error { } func (v *validator) createKeyFromMnemonic(name, mnemonic string) error { - kb, err := keyring.New(keyringAppName, keyring.BackendTest, v.configDir(), nil, cdc) + kb, err := keyring.New(keyringAppName, keyring.BackendTest, v.configDir(), nil, Cdc) if err != nil { return err } @@ -152,7 +152,7 @@ func (v *validator) createKeyFromMnemonic(name, mnemonic string) error { return err } - v.keyInfo = *info + v.KeyInfo = *info v.mnemonic = mnemonic v.privateKey = privKey @@ -183,7 +183,7 @@ func (v *validator) buildCreateValidatorMsg(amount sdk.Coin) (sdk.Msg, error) { if err != nil { return nil, err } - valAddr, err := v.keyInfo.GetAddress() + valAddr, err := v.KeyInfo.GetAddress() if err != nil { return nil, err } @@ -203,7 +203,7 @@ func (v *validator) buildDelegateKeysMsg(orchAddr sdk.AccAddress, ethAddr string if err != nil { return nil, err } - valAddr, err := v.keyInfo.GetAddress() + valAddr, err := v.KeyInfo.GetAddress() if err != nil { return nil, err } @@ -227,7 +227,7 @@ func (v *validator) signMsg(msgs ...sdk.Msg) (*sdktx.Tx, error) { txBuilder.SetGasLimit(appparams.DefaultGasLimit) signerData := authsigning.SignerData{ - ChainID: v.chain.id, + ChainID: v.chain.ID, AccountNumber: 0, Sequence: 0, } @@ -240,7 +240,7 @@ func (v *validator) signMsg(msgs ...sdk.Msg) (*sdktx.Tx, error) { // Note: This line is not needed for SIGN_MODE_LEGACY_AMINO, but putting it // also doesn't affect its generated sign bytes, so for code's simplicity // sake, we put it here. - pubKey, err := v.keyInfo.GetPubKey() + pubKey, err := v.KeyInfo.GetPubKey() if err != nil { return nil, err } diff --git a/tests/e2e/util.go b/tests/e2e/util.go deleted file mode 100644 index 5ee776d0c0..0000000000 --- a/tests/e2e/util.go +++ /dev/null @@ -1,45 +0,0 @@ -package e2e - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/codec/unknownproto" - sdktx "github.com/cosmos/cosmos-sdk/types/tx" -) - -func decodeTx(txBytes []byte) (*sdktx.Tx, error) { - var raw sdktx.TxRaw - - // reject all unknown proto fields in the root TxRaw - err := unknownproto.RejectUnknownFieldsStrict(txBytes, &raw, encodingConfig.InterfaceRegistry) - if err != nil { - return nil, fmt.Errorf("failed to reject unknown fields: %w", err) - } - - if err := cdc.Unmarshal(txBytes, &raw); err != nil { - return nil, err - } - - var body sdktx.TxBody - if err := cdc.Unmarshal(raw.BodyBytes, &body); err != nil { - return nil, fmt.Errorf("failed to decode tx: %w", err) - } - - var authInfo sdktx.AuthInfo - - // reject all unknown proto fields in AuthInfo - err = unknownproto.RejectUnknownFieldsStrict(raw.AuthInfoBytes, &authInfo, encodingConfig.InterfaceRegistry) - if err != nil { - return nil, fmt.Errorf("failed to reject unknown fields: %w", err) - } - - if err := cdc.Unmarshal(raw.AuthInfoBytes, &authInfo); err != nil { - return nil, fmt.Errorf("failed to decode auth info: %w", err) - } - - return &sdktx.Tx{ - Body: &body, - AuthInfo: &authInfo, - Signatures: raw.Signatures, - }, nil -} From f1d0fb19c94346be43a69ea5d7a7debc3e3d85f8 Mon Sep 17 00:00:00 2001 From: Sai Kumar Date: Wed, 21 Jun 2023 12:47:38 +0530 Subject: [PATCH 2/2] move Cdc into E2ESuite cdc --- tests/e2e/cw_test.go | 10 ++--- tests/e2e/e2e_test.go | 2 +- tests/e2e/setup/chain.go | 19 ++++----- tests/e2e/setup/eth_abi.go | 2 +- tests/e2e/setup/ethereum.go | 2 +- tests/e2e/setup/gaia.go | 2 +- tests/e2e/setup/genesis.go | 13 +++--- tests/e2e/setup/io.go | 2 +- tests/e2e/setup/keys.go | 13 +++--- tests/e2e/setup/orchestrator.go | 11 ++--- tests/e2e/setup/setup.go | 75 ++++++++++++++++++--------------- tests/e2e/setup/utils.go | 13 +++--- tests/e2e/setup/validator.go | 19 +++++---- tests/e2e/suite.go | 42 ++++++++---------- 14 files changed, 111 insertions(+), 114 deletions(-) diff --git a/tests/e2e/cw_test.go b/tests/e2e/cw_test.go index 16b33d4624..a47e5ead13 100644 --- a/tests/e2e/cw_test.go +++ b/tests/e2e/cw_test.go @@ -1,11 +1,9 @@ package e2e -import "github.com/umee-network/umee/v5/tests/util" - -type TestCosmwasm struct { - IntegrationTestSuite - util.Cosmwasm -} +// type TestCosmwasm struct { +// IntegrationTestSuite +// util.Cosmwasm +// } /* // TODO : needs to setup live network with dockernet diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index ca729f5996..59be5fc846 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -16,7 +16,7 @@ type E2ETest struct { setup.E2ETestSuite } -func TestE2ETesrtSuite(t *testing.T) { +func TestE2ETestSuite(t *testing.T) { suite.Run(t, new(E2ETest)) } diff --git a/tests/e2e/setup/chain.go b/tests/e2e/setup/chain.go index 762a1b7e74..717a2a0b1d 100644 --- a/tests/e2e/setup/chain.go +++ b/tests/e2e/setup/chain.go @@ -1,4 +1,4 @@ -package e2esetup +package setup import ( "fmt" @@ -23,7 +23,6 @@ const ( var ( encodingConfig sdkparams.EncodingConfig - Cdc codec.Codec ) func init() { @@ -38,8 +37,6 @@ func init() { &secp256k1.PubKey{}, &ed25519.PubKey{}, ) - - Cdc = encodingConfig.Codec } type chain struct { @@ -66,19 +63,19 @@ func (c *chain) configDir() string { return fmt.Sprintf("%s/%s", c.dataDir, c.ID) } -func (c *chain) createAndInitValidators(count int) error { +func (c *chain) createAndInitValidators(cdc codec.Codec, count int) error { for i := 0; i < count; i++ { node := c.createValidator(i) // generate genesis files - if err := node.init(); err != nil { + if err := node.init(cdc); err != nil { return err } c.Validators = append(c.Validators, node) // create keys - if err := node.createKey("val"); err != nil { + if err := node.createKey(cdc, "val"); err != nil { return err } if err := node.createNodeKey(); err != nil { @@ -92,12 +89,12 @@ func (c *chain) createAndInitValidators(count int) error { return nil } -func (c *chain) createAndInitGaiaValidator() error { +func (c *chain) createAndInitGaiaValidator(cdc codec.Codec) error { // create gaia validator gaiaVal := c.createGaiaValidator(0) // create keys - mnemonic, info, err := createMemoryKey() + mnemonic, info, err := createMemoryKey(cdc) if err != nil { return err } @@ -110,12 +107,12 @@ func (c *chain) createAndInitGaiaValidator() error { return nil } -func (c *chain) createAndInitOrchestrators(count int) error { +func (c *chain) createAndInitOrchestrators(cdc codec.Codec, count int) error { for i := 0; i < count; i++ { // create orchestrator orchestrator := c.createOrchestrator(i) - err := orchestrator.createKey("orch") + err := orchestrator.createKey(cdc, "orch") if err != nil { return err } diff --git a/tests/e2e/setup/eth_abi.go b/tests/e2e/setup/eth_abi.go index 204701461b..590536d2c1 100644 --- a/tests/e2e/setup/eth_abi.go +++ b/tests/e2e/setup/eth_abi.go @@ -1,4 +1,4 @@ -package e2esetup +package setup import ( "github.com/ethereum/go-ethereum/accounts/abi" diff --git a/tests/e2e/setup/ethereum.go b/tests/e2e/setup/ethereum.go index 979f1dafbd..f514ddc496 100644 --- a/tests/e2e/setup/ethereum.go +++ b/tests/e2e/setup/ethereum.go @@ -1,4 +1,4 @@ -package e2esetup +package setup type EthereumConfig struct { ChainID uint `json:"chainId"` diff --git a/tests/e2e/setup/gaia.go b/tests/e2e/setup/gaia.go index 0b1781b3b5..0eb5e8db0c 100644 --- a/tests/e2e/setup/gaia.go +++ b/tests/e2e/setup/gaia.go @@ -1,4 +1,4 @@ -package e2esetup +package setup import ( "fmt" diff --git a/tests/e2e/setup/genesis.go b/tests/e2e/setup/genesis.go index b51ad5c19f..2daaac0661 100644 --- a/tests/e2e/setup/genesis.go +++ b/tests/e2e/setup/genesis.go @@ -1,10 +1,11 @@ -package e2esetup +package setup import ( "encoding/json" "fmt" "os" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -38,7 +39,7 @@ func getGenDoc(path string) (*tmtypes.GenesisDoc, error) { return doc, nil } -func addGenesisAccount(path, moniker, amountStr string, accAddr sdk.AccAddress) error { +func addGenesisAccount(cdc codec.Codec, path, moniker, amountStr string, accAddr sdk.AccAddress) error { serverCtx := server.NewDefaultContext() config := serverCtx.Config @@ -59,7 +60,7 @@ func addGenesisAccount(path, moniker, amountStr string, accAddr sdk.AccAddress) return fmt.Errorf("failed to unmarshal genesis state: %w", err) } - authGenState := authtypes.GetGenesisStateFromAppState(Cdc, appState) + authGenState := authtypes.GetGenesisStateFromAppState(cdc, appState) accs, err := authtypes.UnpackAccounts(authGenState.Accounts) if err != nil { @@ -82,18 +83,18 @@ func addGenesisAccount(path, moniker, amountStr string, accAddr sdk.AccAddress) authGenState.Accounts = genAccs - authGenStateBz, err := Cdc.MarshalJSON(&authGenState) + authGenStateBz, err := cdc.MarshalJSON(&authGenState) if err != nil { return fmt.Errorf("failed to marshal auth genesis state: %w", err) } appState[authtypes.ModuleName] = authGenStateBz - bankGenState := banktypes.GetGenesisStateFromAppState(Cdc, appState) + bankGenState := banktypes.GetGenesisStateFromAppState(cdc, appState) bankGenState.Balances = append(bankGenState.Balances, balances) bankGenState.Balances = banktypes.SanitizeGenesisBalances(bankGenState.Balances) - bankGenStateBz, err := Cdc.MarshalJSON(bankGenState) + bankGenStateBz, err := cdc.MarshalJSON(bankGenState) if err != nil { return fmt.Errorf("failed to marshal bank genesis state: %w", err) } diff --git a/tests/e2e/setup/io.go b/tests/e2e/setup/io.go index 32ab24f4eb..55f8fac3e9 100644 --- a/tests/e2e/setup/io.go +++ b/tests/e2e/setup/io.go @@ -1,4 +1,4 @@ -package e2esetup +package setup import ( "fmt" diff --git a/tests/e2e/setup/keys.go b/tests/e2e/setup/keys.go index 9d605445eb..c08bd0c5e8 100644 --- a/tests/e2e/setup/keys.go +++ b/tests/e2e/setup/keys.go @@ -1,11 +1,12 @@ -package e2esetup +package setup import ( + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/go-bip39" - appparams "github.com/umee-network/umee/v4/app/params" + appparams "github.com/umee-network/umee/v5/app/params" ) const ( @@ -50,13 +51,13 @@ func createMnemonic() (string, error) { return mnemonic, nil } -func createMemoryKey() (mnemonic string, info *keyring.Record, err error) { +func createMemoryKey(cdc codec.Codec) (mnemonic string, info *keyring.Record, err error) { mnemonic, err = createMnemonic() if err != nil { return "", nil, err } - account, err := createMemoryKeyFromMnemonic(mnemonic) + account, err := createMemoryKeyFromMnemonic(cdc, mnemonic) if err != nil { return "", nil, err } @@ -64,8 +65,8 @@ func createMemoryKey() (mnemonic string, info *keyring.Record, err error) { return mnemonic, account, nil } -func createMemoryKeyFromMnemonic(mnemonic string) (*keyring.Record, error) { - kb, err := keyring.New("testnet", keyring.BackendMemory, "", nil, Cdc) +func createMemoryKeyFromMnemonic(cdc codec.Codec, mnemonic string) (*keyring.Record, error) { + kb, err := keyring.New("testnet", keyring.BackendMemory, "", nil, cdc) if err != nil { return nil, err } diff --git a/tests/e2e/setup/orchestrator.go b/tests/e2e/setup/orchestrator.go index e32d03606b..e70f19d008 100644 --- a/tests/e2e/setup/orchestrator.go +++ b/tests/e2e/setup/orchestrator.go @@ -1,9 +1,10 @@ -package e2esetup +package setup import ( "crypto/ecdsa" "fmt" + "github.com/cosmos/cosmos-sdk/codec" sdkcrypto "github.com/cosmos/cosmos-sdk/crypto" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" @@ -56,17 +57,17 @@ func (o *orchestrator) generateEthereumKey() error { return nil } -func (o *orchestrator) createKey(name string) error { +func (o *orchestrator) createKey(cdc codec.Codec, name string) error { mnemonic, err := createMnemonic() if err != nil { return err } - return o.createKeyFromMnemonic(name, mnemonic) + return o.createKeyFromMnemonic(cdc, name, mnemonic) } -func (o *orchestrator) createKeyFromMnemonic(name, mnemonic string) error { - kb, err := keyring.New(keyringAppName, keyring.BackendMemory, "", nil, Cdc) +func (o *orchestrator) createKeyFromMnemonic(cdc codec.Codec, name, mnemonic string) error { + kb, err := keyring.New(keyringAppName, keyring.BackendMemory, "", nil, cdc) if err != nil { return err } diff --git a/tests/e2e/setup/setup.go b/tests/e2e/setup/setup.go index 92fa643b3a..abf648a40b 100644 --- a/tests/e2e/setup/setup.go +++ b/tests/e2e/setup/setup.go @@ -1,4 +1,4 @@ -package e2esetup +package setup import ( "bytes" @@ -16,6 +16,7 @@ import ( "time" gravitytypes "github.com/Gravity-Bridge/Gravity-Bridge/module/x/gravity/types" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server" srvconfig "github.com/cosmos/cosmos-sdk/server/config" sdk "github.com/cosmos/cosmos-sdk/types" @@ -34,13 +35,13 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - "github.com/umee-network/umee/v4/app" - appparams "github.com/umee-network/umee/v4/app/params" - "github.com/umee-network/umee/v4/client" - "github.com/umee-network/umee/v4/x/leverage/fixtures" - leveragetypes "github.com/umee-network/umee/v4/x/leverage/types" - oracletypes "github.com/umee-network/umee/v4/x/oracle/types" - "github.com/umee-network/umee/v4/x/uibc" + "github.com/umee-network/umee/v5/app" + appparams "github.com/umee-network/umee/v5/app/params" + "github.com/umee-network/umee/v5/client" + "github.com/umee-network/umee/v5/x/leverage/fixtures" + leveragetypes "github.com/umee-network/umee/v5/x/leverage/types" + oracletypes "github.com/umee-network/umee/v5/x/oracle/types" + "github.com/umee-network/umee/v5/x/uibc" ) type E2ETestSuite struct { @@ -60,12 +61,16 @@ type E2ETestSuite struct { OrchResources []*dockertest.Resource GravityContractAddr string Umee client.Client + cdc codec.Codec } func (s *E2ETestSuite) SetupSuite() { + var err error s.T().Log("setting up e2e integration test suite...") - var err error + // codec + s.cdc = encodingConfig.Codec + s.Chain, err = newChain() s.Require().NoError(err) @@ -147,9 +152,9 @@ func (s *E2ETestSuite) TearDownSuite() { } func (s *E2ETestSuite) initNodes() { - s.Require().NoError(s.Chain.createAndInitValidators(3)) - s.Require().NoError(s.Chain.createAndInitOrchestrators(3)) - s.Require().NoError(s.Chain.createAndInitGaiaValidator()) + s.Require().NoError(s.Chain.createAndInitValidators(s.cdc, 3)) + s.Require().NoError(s.Chain.createAndInitOrchestrators(s.cdc, 3)) + s.Require().NoError(s.Chain.createAndInitGaiaValidator(s.cdc)) // initialize a genesis file for the first validator val0ConfigDir := s.Chain.Validators[0].configDir() @@ -157,7 +162,7 @@ func (s *E2ETestSuite) initNodes() { valAddr, err := val.KeyInfo.GetAddress() s.Require().NoError(err) s.Require().NoError( - addGenesisAccount(val0ConfigDir, "", InitBalanceStr, valAddr), + addGenesisAccount(s.cdc, val0ConfigDir, "", InitBalanceStr, valAddr), ) } @@ -167,7 +172,7 @@ func (s *E2ETestSuite) initNodes() { s.Require().NoError(err) s.Require().NoError( - addGenesisAccount(val0ConfigDir, "", InitBalanceStr, orchAddr), + addGenesisAccount(s.cdc, val0ConfigDir, "", InitBalanceStr, orchAddr), ) } @@ -220,40 +225,40 @@ func (s *E2ETestSuite) initGenesis() { // Gravity Bridge var gravityGenState gravitytypes.GenesisState - s.Require().NoError(Cdc.UnmarshalJSON(appGenState[gravitytypes.ModuleName], &gravityGenState)) + s.Require().NoError(s.cdc.UnmarshalJSON(appGenState[gravitytypes.ModuleName], &gravityGenState)) gravityGenState.Params.BridgeChainId = uint64(EthChainID) - bz, err := Cdc.MarshalJSON(&gravityGenState) + bz, err := s.cdc.MarshalJSON(&gravityGenState) s.Require().NoError(err) appGenState[gravitytypes.ModuleName] = bz var bech32GenState bech32ibctypes.GenesisState - s.Require().NoError(Cdc.UnmarshalJSON(appGenState[bech32ibctypes.ModuleName], &bech32GenState)) + s.Require().NoError(s.cdc.UnmarshalJSON(appGenState[bech32ibctypes.ModuleName], &bech32GenState)) // bech32 bech32GenState.NativeHRP = sdk.GetConfig().GetBech32AccountAddrPrefix() - bz, err = Cdc.MarshalJSON(&bech32GenState) + bz, err = s.cdc.MarshalJSON(&bech32GenState) s.Require().NoError(err) appGenState[bech32ibctypes.ModuleName] = bz // Leverage var leverageGenState leveragetypes.GenesisState - s.Require().NoError(Cdc.UnmarshalJSON(appGenState[leveragetypes.ModuleName], &leverageGenState)) + s.Require().NoError(s.cdc.UnmarshalJSON(appGenState[leveragetypes.ModuleName], &leverageGenState)) leverageGenState.Registry = append(leverageGenState.Registry, fixtures.Token(appparams.BondDenom, appparams.DisplayDenom, 6), fixtures.Token(ATOMBaseDenom, ATOM, uint32(ATOMExponent)), ) - bz, err = Cdc.MarshalJSON(&leverageGenState) + bz, err = s.cdc.MarshalJSON(&leverageGenState) s.Require().NoError(err) appGenState[leveragetypes.ModuleName] = bz // Oracle var oracleGenState oracletypes.GenesisState - s.Require().NoError(Cdc.UnmarshalJSON(appGenState[oracletypes.ModuleName], &oracleGenState)) + s.Require().NoError(s.cdc.UnmarshalJSON(appGenState[oracletypes.ModuleName], &oracleGenState)) oracleGenState.Params.HistoricStampPeriod = 5 oracleGenState.Params.MaximumPriceStamps = 4 @@ -266,25 +271,25 @@ func (s *E2ETestSuite) initGenesis() { Exponent: uint32(ATOMExponent), }) - bz, err = Cdc.MarshalJSON(&oracleGenState) + bz, err = s.cdc.MarshalJSON(&oracleGenState) s.Require().NoError(err) appGenState[oracletypes.ModuleName] = bz // Gov var govGenState govtypesv1.GenesisState - s.Require().NoError(Cdc.UnmarshalJSON(appGenState[govtypes.ModuleName], &govGenState)) + s.Require().NoError(s.cdc.UnmarshalJSON(appGenState[govtypes.ModuleName], &govGenState)) votingPeroid := 5 * time.Second govGenState.VotingParams.VotingPeriod = &votingPeroid govGenState.DepositParams.MinDeposit = sdk.NewCoins(sdk.NewCoin(appparams.BondDenom, sdk.NewInt(100))) - bz, err = Cdc.MarshalJSON(&govGenState) + bz, err = s.cdc.MarshalJSON(&govGenState) s.Require().NoError(err) appGenState[govtypes.ModuleName] = bz // Bank var bankGenState banktypes.GenesisState - s.Require().NoError(Cdc.UnmarshalJSON(appGenState[banktypes.ModuleName], &bankGenState)) + s.Require().NoError(s.cdc.UnmarshalJSON(appGenState[banktypes.ModuleName], &bankGenState)) bankGenState.DenomMetadata = append(bankGenState.DenomMetadata, banktypes.Metadata{ Description: "An example stable token", @@ -300,13 +305,13 @@ func (s *E2ETestSuite) initGenesis() { }, }) - bz, err = Cdc.MarshalJSON(&bankGenState) + bz, err = s.cdc.MarshalJSON(&bankGenState) s.Require().NoError(err) appGenState[banktypes.ModuleName] = bz // uibc (ibc quota) var uibcGenState uibc.GenesisState - s.Require().NoError(Cdc.UnmarshalJSON(appGenState[uibc.ModuleName], &uibcGenState)) + s.Require().NoError(s.cdc.UnmarshalJSON(appGenState[uibc.ModuleName], &uibcGenState)) // 100$ for each token uibcGenState.Params.TokenQuota = sdk.NewDec(100) @@ -315,12 +320,12 @@ func (s *E2ETestSuite) initGenesis() { // quotas will reset every 300 seconds uibcGenState.Params.QuotaDuration = time.Second * 300 - bz, err = Cdc.MarshalJSON(&uibcGenState) + bz, err = s.cdc.MarshalJSON(&uibcGenState) s.Require().NoError(err) appGenState[uibc.ModuleName] = bz var genUtilGenState genutiltypes.GenesisState - s.Require().NoError(Cdc.UnmarshalJSON(appGenState[genutiltypes.ModuleName], &genUtilGenState)) + s.Require().NoError(s.cdc.UnmarshalJSON(appGenState[genutiltypes.ModuleName], &genUtilGenState)) // generate genesis txs genTxs := make([]json.RawMessage, len(s.Chain.Validators)) @@ -339,10 +344,10 @@ func (s *E2ETestSuite) initGenesis() { delKeysMsg, err := val.buildDelegateKeysMsg(orchAddr, s.Chain.Orchestrators[i].EthereumKey.Address) s.Require().NoError(err) - signedTx, err := val.signMsg(createValmsg, delKeysMsg) + signedTx, err := val.signMsg(s.cdc, createValmsg, delKeysMsg) s.Require().NoError(err) - txRaw, err := Cdc.MarshalJSON(signedTx) + txRaw, err := s.cdc.MarshalJSON(signedTx) s.Require().NoError(err) genTxs[i] = txRaw @@ -350,7 +355,7 @@ func (s *E2ETestSuite) initGenesis() { genUtilGenState.GenTxs = genTxs - bz, err = Cdc.MarshalJSON(&genUtilGenState) + bz, err = s.cdc.MarshalJSON(&genUtilGenState) s.Require().NoError(err) appGenState[genutiltypes.ModuleName] = bz @@ -1052,9 +1057,9 @@ func (s *E2ETestSuite) runPriceFeeder() { func (s *E2ETestSuite) initUmeeClient() { var err error - mnemonics := make([]string, 0) - for _, v := range s.Chain.Validators { - mnemonics = append(mnemonics, v.mnemonic) + mnemonics := make(map[string]string) + for index, v := range s.Chain.Validators { + mnemonics[fmt.Sprintf("val%d", index)] = v.mnemonic } ecfg := app.MakeEncodingConfig() diff --git a/tests/e2e/setup/utils.go b/tests/e2e/setup/utils.go index 890a63eccf..d0fc3cbfe9 100644 --- a/tests/e2e/setup/utils.go +++ b/tests/e2e/setup/utils.go @@ -1,4 +1,4 @@ -package e2esetup +package setup import ( "bytes" @@ -14,6 +14,7 @@ import ( gravitytypes "github.com/Gravity-Bridge/Gravity-Bridge/module/x/gravity/types" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/unknownproto" sdk "github.com/cosmos/cosmos-sdk/types" sdktx "github.com/cosmos/cosmos-sdk/types/tx" @@ -430,7 +431,7 @@ func (s *E2ETestSuite) QueryREST(endpoint string, valPtr interface{}) error { if err != nil { return fmt.Errorf("failed to read response body: %w, endpoint: %s", err, endpoint) } - if err = Cdc.UnmarshalJSON(bz, valProto); err != nil { + if err = s.cdc.UnmarshalJSON(bz, valProto); err != nil { return fmt.Errorf("failed to protoJSON.decode response body: %w, endpoint: %s", err, endpoint) } } else { @@ -604,7 +605,7 @@ func (s *E2ETestSuite) QueryUmeeEthBalance( return umeeBalance, ethBalance, umeeAddr, ethAddr } -func decodeTx(txBytes []byte) (*sdktx.Tx, error) { +func decodeTx(cdc codec.Codec, txBytes []byte) (*sdktx.Tx, error) { var raw sdktx.TxRaw // reject all unknown proto fields in the root TxRaw @@ -613,12 +614,12 @@ func decodeTx(txBytes []byte) (*sdktx.Tx, error) { return nil, fmt.Errorf("failed to reject unknown fields: %w", err) } - if err := Cdc.Unmarshal(txBytes, &raw); err != nil { + if err := cdc.Unmarshal(txBytes, &raw); err != nil { return nil, err } var body sdktx.TxBody - if err := Cdc.Unmarshal(raw.BodyBytes, &body); err != nil { + if err := cdc.Unmarshal(raw.BodyBytes, &body); err != nil { return nil, fmt.Errorf("failed to decode tx: %w", err) } @@ -630,7 +631,7 @@ func decodeTx(txBytes []byte) (*sdktx.Tx, error) { return nil, fmt.Errorf("failed to reject unknown fields: %w", err) } - if err := Cdc.Unmarshal(raw.AuthInfoBytes, &authInfo); err != nil { + if err := cdc.Unmarshal(raw.AuthInfoBytes, &authInfo); err != nil { return nil, fmt.Errorf("failed to decode auth info: %w", err) } diff --git a/tests/e2e/setup/validator.go b/tests/e2e/setup/validator.go index e5aa7c49aa..610ab17694 100644 --- a/tests/e2e/setup/validator.go +++ b/tests/e2e/setup/validator.go @@ -1,4 +1,4 @@ -package e2esetup +package setup import ( "encoding/json" @@ -8,6 +8,7 @@ import ( "path/filepath" gravitytypes "github.com/Gravity-Bridge/Gravity-Bridge/module/x/gravity/types" + "github.com/cosmos/cosmos-sdk/codec" sdkcrypto "github.com/cosmos/cosmos-sdk/crypto" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/hd" @@ -53,7 +54,7 @@ func (v *validator) createConfig() error { return os.MkdirAll(p, 0o755) } -func (v *validator) init() error { +func (v *validator) init(cdc codec.Codec) error { if err := v.createConfig(); err != nil { return err } @@ -69,7 +70,7 @@ func (v *validator) init() error { return err } - appState, err := json.MarshalIndent(umeeapp.ModuleBasics.DefaultGenesis(Cdc), "", " ") + appState, err := json.MarshalIndent(umeeapp.ModuleBasics.DefaultGenesis(cdc), "", " ") if err != nil { return fmt.Errorf("failed to JSON encode app genesis state: %w", err) } @@ -125,8 +126,8 @@ func (v *validator) createConsensusKey() error { return nil } -func (v *validator) createKeyFromMnemonic(name, mnemonic string) error { - kb, err := keyring.New(keyringAppName, keyring.BackendTest, v.configDir(), nil, Cdc) +func (v *validator) createKeyFromMnemonic(cdc codec.Codec, name, mnemonic string) error { + kb, err := keyring.New(keyringAppName, keyring.BackendTest, v.configDir(), nil, cdc) if err != nil { return err } @@ -159,13 +160,13 @@ func (v *validator) createKeyFromMnemonic(name, mnemonic string) error { return nil } -func (v *validator) createKey(name string) error { +func (v *validator) createKey(cdc codec.Codec, name string) error { mnemonic, err := createMnemonic() if err != nil { return err } - return v.createKeyFromMnemonic(name, mnemonic) + return v.createKeyFromMnemonic(cdc, name, mnemonic) } func (v *validator) buildCreateValidatorMsg(amount sdk.Coin) (sdk.Msg, error) { @@ -215,7 +216,7 @@ func (v *validator) buildDelegateKeysMsg(orchAddr sdk.AccAddress, ethAddr string ), nil } -func (v *validator) signMsg(msgs ...sdk.Msg) (*sdktx.Tx, error) { +func (v *validator) signMsg(cdc codec.Codec, msgs ...sdk.Msg) (*sdktx.Tx, error) { txBuilder := encodingConfig.TxConfig.NewTxBuilder() if err := txBuilder.SetMsgs(msgs...); err != nil { @@ -289,5 +290,5 @@ func (v *validator) signMsg(msgs ...sdk.Msg) (*sdktx.Tx, error) { return nil, err } - return decodeTx(bz) + return decodeTx(cdc, bz) } diff --git a/tests/e2e/suite.go b/tests/e2e/suite.go index 0202e34872..48a7a5516b 100644 --- a/tests/e2e/suite.go +++ b/tests/e2e/suite.go @@ -1,28 +1,20 @@ package e2e -import ( - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ory/dockertest/v3" - "github.com/stretchr/testify/suite" - rpchttp "github.com/tendermint/tendermint/rpc/client/http" - "github.com/umee-network/umee/v5/client" -) +// type IntegrationTestSuite struct { +// suite.Suite -type IntegrationTestSuite struct { - suite.Suite - - tmpDirs []string - chain *chain - ethClient *ethclient.Client - gaiaRPC *rpchttp.HTTP - dkrPool *dockertest.Pool - dkrNet *dockertest.Network - ethResource *dockertest.Resource - gaiaResource *dockertest.Resource - hermesResource *dockertest.Resource - priceFeederResource *dockertest.Resource - valResources []*dockertest.Resource - orchResources []*dockertest.Resource - gravityContractAddr string - umee client.Client -} +// tmpDirs []string +// chain *setup.chain +// ethClient *ethclient.Client +// gaiaRPC *rpchttp.HTTP +// dkrPool *dockertest.Pool +// dkrNet *dockertest.Network +// ethResource *dockertest.Resource +// gaiaResource *dockertest.Resource +// hermesResource *dockertest.Resource +// priceFeederResource *dockertest.Resource +// valResources []*dockertest.Resource +// orchResources []*dockertest.Resource +// gravityContractAddr string +// umee client.Client +// }