From 87fade84d680e34ccbcc517d1c11795e60a8e7e3 Mon Sep 17 00:00:00 2001 From: jstr1121 Date: Tue, 18 Jul 2023 18:01:38 +0800 Subject: [PATCH] Add staking param query utility & LSM params update process on LSM e2e test --- tests/e2e/e2e_lsm_test.go | 43 +++++++++++++++++++++++++++++++++---- tests/e2e/e2e_setup_test.go | 43 +++++++++++++++++++++++++++++++++++++ tests/e2e/query.go | 14 ++++++++++++ 3 files changed, 96 insertions(+), 4 deletions(-) diff --git a/tests/e2e/e2e_lsm_test.go b/tests/e2e/e2e_lsm_test.go index 790eb5f1279..f03e7731cff 100644 --- a/tests/e2e/e2e_lsm_test.go +++ b/tests/e2e/e2e_lsm_test.go @@ -7,20 +7,55 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" + gov "github.com/cosmos/cosmos-sdk/x/gov/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal" ) func (s *IntegrationTestSuite) testLSM() { - // TODO: Set parameters (global liquid staking cap, validator liquid staking cap, validator bond factor) chainEndpoint := fmt.Sprintf("http://%s", s.valResources[s.chainA.id][0].GetHostPort("1317/tcp")) validatorA := s.chainA.validators[0] - // validatorB := s.chainA.validators[1] validatorAAddr := validatorA.keyInfo.GetAddress() - // validatorBAddr := validatorB.keyInfo.GetAddress() validatorAddressA := sdk.ValAddress(validatorAAddr).String() - // validatorAddressB := sdk.ValAddress(validatorBAddr).String() + // Set parameters (global liquid staking cap, validator liquid staking cap, validator bond factor) + s.writeLiquidStakingParamsUpdateProposal(s.chainA) + submitGovFlags := []string{"param-change", configFile(proposalLSMParamUpdateFilename)} + depositGovFlags := []string{strconv.Itoa(proposalCounter), depositAmount.String()} + voteGovFlags := []string{strconv.Itoa(proposalCounter), "yes"} + + // gov proposing LSM parameters (global liquid staking cap, validator liquid staking cap, validator bond factor) + s.T().Logf("Proposal number: %d", proposalCounter) + s.T().Logf("Submitting, deposit and vote legacy Gov Proposal: Set parameters (global liquid staking cap, validator liquid staking cap, validator bond factor)") + s.runGovProcess(chainEndpoint, validatorAAddr.String(), proposalCounter, paramtypes.ProposalTypeChange, submitGovFlags, depositGovFlags, voteGovFlags, "vote", false) + + // query the proposal status and new fee + s.Require().Eventually( + func() bool { + proposal, err := queryGovProposal(chainEndpoint, proposalCounter) + s.Require().NoError(err) + return proposal.GetProposal().Status == gov.StatusPassed + }, + 15*time.Second, + 5*time.Second, + ) + + s.Require().Eventually( + func() bool { + stakingParams, err := queryStakingParams(chainEndpoint) + s.T().Logf("After LSM parameters update proposal") + s.Require().NoError(err) + + s.Require().Equal(stakingParams.Params.GlobalLiquidStakingCap, sdk.NewDecWithPrec(30, 2)) + s.Require().Equal(stakingParams.Params.ValidatorLiquidStakingCap, sdk.NewDecWithPrec(100, 2)) + s.Require().Equal(stakingParams.Params.ValidatorBondFactor, sdk.NewDec(-1)) + + return true + }, + 15*time.Second, + 5*time.Second, + ) delegatorAddress := s.chainA.genesisAccounts[2].keyInfo.GetAddress().String() fees := sdk.NewCoin(uatomDenom, sdk.NewInt(1)) diff --git a/tests/e2e/e2e_setup_test.go b/tests/e2e/e2e_setup_test.go index 37c2b910d80..459ee276740 100644 --- a/tests/e2e/e2e_setup_test.go +++ b/tests/e2e/e2e_setup_test.go @@ -72,6 +72,7 @@ const ( proposalCommunitySpendFilename = "proposal_community_spend.json" proposalAddConsumerChainFilename = "proposal_add_consumer.json" proposalRemoveConsumerChainFilename = "proposal_remove_consumer.json" + proposalLSMParamUpdateFilename = "proposal_lsm_param_update.json" hermesBinary = "hermes" hermesConfigWithGasPrices = "/root/.hermes/config.toml" @@ -929,6 +930,48 @@ func (s *IntegrationTestSuite) writeAddRemoveConsumerProposals(c *chain, consume s.Require().NoError(err) } +func (s *IntegrationTestSuite) writeLiquidStakingParamsUpdateProposal(c *chain) { + type ParamInfo struct { + Subspace string `json:"subspace"` + Key string `json:"key"` + Value sdk.Dec `json:"value"` + } + + type ParamChangeMessage struct { + Title string `json:"title"` + Description string `json:"description"` + Changes []ParamInfo `json:"changes"` + Deposit string `json:"deposit"` + } + + paramChangeProposalBody, err := json.MarshalIndent(ParamChangeMessage{ + Title: "liquid staking params update", + Description: "liquid staking params update", + Changes: []ParamInfo{ + { + Subspace: "staking", + Key: "GlobalLiquidStakingCap", + Value: sdk.NewDecWithPrec(30, 2), // 30% + }, + { + Subspace: "staking", + Key: "ValidatorLiquidStakingCap", + Value: sdk.NewDecWithPrec(100, 2), // 100% + }, + { + Subspace: "staking", + Key: "ValidatorBondFactor", + Value: sdk.NewDec(-1), // -1 + }, + }, + Deposit: "1000uatom", + }, "", " ") + s.Require().NoError(err) + + err = writeFile(filepath.Join(c.validators[0].configDir(), "config", proposalLSMParamUpdateFilename), paramChangeProposalBody) + s.Require().NoError(err) +} + func configFile(filename string) string { filepath := filepath.Join(gaiaConfigPath, filename) return filepath diff --git a/tests/e2e/query.go b/tests/e2e/query.go index 71fa198c5f8..dde822d9177 100644 --- a/tests/e2e/query.go +++ b/tests/e2e/query.go @@ -74,6 +74,20 @@ func queryGaiaAllBalances(endpoint, addr string) (sdk.Coins, error) { return balancesResp.Balances, nil } +func queryStakingParams(endpoint string) (stakingtypes.QueryParamsResponse, error) { + body, err := httpGet(fmt.Sprintf("%s/cosmos/staking/v1beta1/params", endpoint)) + if err != nil { + return stakingtypes.QueryParamsResponse{}, fmt.Errorf("failed to execute HTTP request: %w", err) + } + + var params stakingtypes.QueryParamsResponse + if err := cdc.UnmarshalJSON(body, ¶ms); err != nil { + return stakingtypes.QueryParamsResponse{}, err + } + + return params, nil +} + func queryGlobalFeeParams(endpoint string) (types.QueryParamsResponse, error) { body, err := httpGet(fmt.Sprintf("%s/gaia/globalfee/v1beta1/params", endpoint)) if err != nil {