2023-10-11 17:22:25 +00:00
|
|
|
package e2e_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/hex"
|
|
|
|
|
|
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
2024-05-01 05:53:58 +00:00
|
|
|
// communitytypes "github.com/0glabs/0g-chain/x/community/types"
|
2023-10-11 17:22:25 +00:00
|
|
|
)
|
|
|
|
|
2024-05-01 05:53:58 +00:00
|
|
|
// func (suite *IntegrationTestSuite) TestCommunityUpdateParams_NonAuthority() {
|
|
|
|
// // ARRANGE
|
|
|
|
// // setup 0g account
|
|
|
|
// funds := a0gi(1e5) // .1 A0GI
|
|
|
|
// zgChainAcc := suite.ZgChain.NewFundedAccount("community-non-authority", sdk.NewCoins(funds))
|
|
|
|
|
|
|
|
// gasLimit := int64(2e5)
|
|
|
|
// fee := a0gi(200)
|
|
|
|
|
|
|
|
// msg := communitytypes.NewMsgUpdateParams(
|
|
|
|
// zgChainAcc.SdkAddress,
|
|
|
|
// communitytypes.DefaultParams(),
|
|
|
|
// )
|
|
|
|
|
|
|
|
// // ACT
|
|
|
|
// req := util.ZgChainMsgRequest{
|
|
|
|
// Msgs: []sdk.Msg{&msg},
|
|
|
|
// GasLimit: uint64(gasLimit),
|
|
|
|
// FeeAmount: sdk.NewCoins(fee),
|
|
|
|
// Memo: "this is a failure!",
|
|
|
|
// }
|
|
|
|
// res := zgChainAcc.SignAndBroadcastZgChainTx(req)
|
|
|
|
|
|
|
|
// // ASSERT
|
|
|
|
// _, err := util.WaitForSdkTxCommit(suite.ZgChain.Grpc.Query.Tx, res.Result.TxHash, 6*time.Second)
|
|
|
|
// suite.Require().Error(err)
|
|
|
|
// suite.Require().ErrorContains(
|
|
|
|
// err,
|
|
|
|
// govtypes.ErrInvalidSigner.Error(),
|
|
|
|
// "should return with authority check error",
|
|
|
|
// )
|
|
|
|
// }
|
|
|
|
|
|
|
|
// func (suite *IntegrationTestSuite) TestCommunityUpdateParams_Authority() {
|
|
|
|
// // ARRANGE
|
|
|
|
// govParamsRes, err := suite.ZgChain.Grpc.Query.Gov.Params(context.Background(), &govv1.QueryParamsRequest{
|
|
|
|
// ParamsType: govv1.ParamDeposit,
|
|
|
|
// })
|
|
|
|
// suite.NoError(err)
|
|
|
|
|
|
|
|
// // Check initial params
|
|
|
|
// communityParamsResInitial, err := suite.ZgChain.Grpc.Query.Community.Params(
|
|
|
|
// context.Background(),
|
|
|
|
// &communitytypes.QueryParamsRequest{},
|
|
|
|
// )
|
|
|
|
// suite.Require().NoError(err)
|
|
|
|
|
|
|
|
// // setup 0g account
|
|
|
|
// // .1 A0GI + min deposit amount for proposal
|
|
|
|
// funds := sdk.NewCoins(a0gi(1e5)).Add(govParamsRes.DepositParams.MinDeposit...)
|
|
|
|
// zgChainAcc := suite.ZgChain.NewFundedAccount("community-update-params", funds)
|
|
|
|
|
|
|
|
// gasLimit := int64(2e5)
|
|
|
|
// fee := a0gi(200)
|
|
|
|
|
|
|
|
// // Wait until switchover actually happens - When testing without the upgrade
|
|
|
|
// // handler that sets a relative switchover time, the switchover time in
|
|
|
|
// // genesis should be set in the past so it runs immediately.
|
|
|
|
// suite.Require().Eventually(
|
|
|
|
// func() bool {
|
|
|
|
// params, err := suite.ZgChain.Grpc.Query.Community.Params(
|
|
|
|
// context.Background(),
|
|
|
|
// &communitytypes.QueryParamsRequest{},
|
|
|
|
// )
|
|
|
|
// suite.Require().NoError(err)
|
|
|
|
|
|
|
|
// return params.Params.UpgradeTimeDisableInflation.Equal(time.Time{})
|
|
|
|
// },
|
|
|
|
// 20*time.Second,
|
|
|
|
// 1*time.Second,
|
|
|
|
// "switchover should happen",
|
|
|
|
// )
|
|
|
|
|
|
|
|
// // Add 1 to the staking rewards per second
|
|
|
|
// newStakingRewardsPerSecond := communityParamsResInitial.Params.
|
|
|
|
// StakingRewardsPerSecond.
|
|
|
|
// Add(sdkmath.LegacyNewDec(1))
|
|
|
|
|
|
|
|
// // 1. Proposal
|
|
|
|
// // Only modify stakingRewardsPerSecond, as to not re-run the switchover and
|
|
|
|
// // to not influence other tests
|
|
|
|
// updateParamsMsg := communitytypes.NewMsgUpdateParams(
|
|
|
|
// authtypes.NewModuleAddress(govtypes.ModuleName), // authority
|
|
|
|
// communitytypes.NewParams(
|
|
|
|
// time.Time{}, // after switchover, is empty
|
|
|
|
// newStakingRewardsPerSecond, // only modify stakingRewardsPerSecond
|
|
|
|
// communityParamsResInitial.Params.UpgradeTimeSetStakingRewardsPerSecond,
|
|
|
|
// ),
|
|
|
|
// )
|
|
|
|
|
|
|
|
// // Make sure we're actually changing the params
|
|
|
|
// suite.NotEqual(
|
|
|
|
// updateParamsMsg.Params,
|
|
|
|
// communityParamsResInitial.Params,
|
|
|
|
// "new params should be different from existing",
|
|
|
|
// )
|
|
|
|
|
|
|
|
// proposalMsg, err := govv1.NewMsgSubmitProposal(
|
|
|
|
// []sdk.Msg{&updateParamsMsg},
|
|
|
|
// govParamsRes.Params.MinDeposit,
|
|
|
|
// zgChainAcc.SdkAddress.String(),
|
|
|
|
// "community-update-params",
|
|
|
|
// "title",
|
|
|
|
// "summary",
|
|
|
|
// )
|
|
|
|
// suite.NoError(err)
|
|
|
|
|
|
|
|
// req := util.ZgChainMsgRequest{
|
|
|
|
// Msgs: []sdk.Msg{proposalMsg},
|
|
|
|
// GasLimit: uint64(gasLimit),
|
|
|
|
// FeeAmount: sdk.NewCoins(fee),
|
|
|
|
// Memo: "this is a proposal please accept me",
|
|
|
|
// }
|
|
|
|
// res := zgChainAcc.SignAndBroadcastZgChainTx(req)
|
|
|
|
// suite.Require().NoError(res.Err)
|
|
|
|
|
|
|
|
// // Wait for proposal to be submitted
|
|
|
|
// txRes, err := util.WaitForSdkTxCommit(suite.ZgChain.Grpc.Query.Tx, res.Result.TxHash, 6*time.Second)
|
|
|
|
// suite.Require().NoError(err)
|
|
|
|
|
|
|
|
// // Parse tx response to get proposal id
|
|
|
|
// var govRes govv1.MsgSubmitProposalResponse
|
|
|
|
// suite.decodeTxMsgResponse(txRes, &govRes)
|
|
|
|
|
|
|
|
// // 2. Vote for proposal from whale account
|
|
|
|
// whale := suite.ZgChain.GetAccount(testutil.FundedAccountName)
|
|
|
|
// voteMsg := govv1.NewMsgVote(
|
|
|
|
// whale.SdkAddress,
|
|
|
|
// govRes.ProposalId,
|
|
|
|
// govv1.OptionYes,
|
|
|
|
// "",
|
|
|
|
// )
|
|
|
|
|
|
|
|
// voteReq := util.ZgChainMsgRequest{
|
|
|
|
// Msgs: []sdk.Msg{voteMsg},
|
|
|
|
// GasLimit: uint64(gasLimit),
|
|
|
|
// FeeAmount: sdk.NewCoins(fee),
|
|
|
|
// Memo: "voting",
|
|
|
|
// }
|
|
|
|
// voteRes := whale.SignAndBroadcastZgChainTx(voteReq)
|
|
|
|
// suite.Require().NoError(voteRes.Err)
|
|
|
|
|
|
|
|
// _, err = util.WaitForSdkTxCommit(suite.ZgChain.Grpc.Query.Tx, voteRes.Result.TxHash, 6*time.Second)
|
|
|
|
// suite.Require().NoError(err)
|
|
|
|
|
|
|
|
// // 3. Wait until proposal passes
|
|
|
|
// suite.Require().Eventually(func() bool {
|
|
|
|
// proposalRes, err := suite.ZgChain.Grpc.Query.Gov.Proposal(context.Background(), &govv1.QueryProposalRequest{
|
|
|
|
// ProposalId: govRes.ProposalId,
|
|
|
|
// })
|
|
|
|
// suite.NoError(err)
|
|
|
|
|
|
|
|
// return proposalRes.Proposal.Status == govv1.StatusPassed
|
|
|
|
// }, 60*time.Second, 1*time.Second)
|
|
|
|
|
|
|
|
// // Check parameters are updated
|
|
|
|
// communityParamsRes, err := suite.ZgChain.Grpc.Query.Community.Params(
|
|
|
|
// context.Background(),
|
|
|
|
// &communitytypes.QueryParamsRequest{},
|
|
|
|
// )
|
|
|
|
// suite.Require().NoError(err)
|
|
|
|
|
|
|
|
// suite.Equal(updateParamsMsg.Params, communityParamsRes.Params)
|
|
|
|
// }
|
|
|
|
|
2023-10-11 17:22:25 +00:00
|
|
|
func (suite *IntegrationTestSuite) decodeTxMsgResponse(txRes *sdk.TxResponse, ptr codec.ProtoMarshaler) {
|
|
|
|
// convert txRes.Data hex string to bytes
|
|
|
|
txResBytes, err := hex.DecodeString(txRes.Data)
|
|
|
|
suite.Require().NoError(err)
|
|
|
|
|
|
|
|
// Unmarshal data to TxMsgData
|
|
|
|
var txMsgData sdk.TxMsgData
|
2024-05-01 05:53:58 +00:00
|
|
|
suite.ZgChain.EncodingConfig.Marshaler.MustUnmarshal(txResBytes, &txMsgData)
|
2023-10-11 17:22:25 +00:00
|
|
|
suite.T().Logf("txData.MsgResponses: %v", txMsgData.MsgResponses)
|
|
|
|
|
|
|
|
// Parse MsgResponse
|
2024-05-01 05:53:58 +00:00
|
|
|
suite.ZgChain.EncodingConfig.Marshaler.MustUnmarshal(txMsgData.MsgResponses[0].Value, ptr)
|
2023-10-11 17:22:25 +00:00
|
|
|
suite.Require().NoError(err)
|
|
|
|
}
|