mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 14:57:27 +00:00 
			
		
		
		
	feat(community): add MsgUpdateParams for governance (#1745)
* Add authority, MsgUpdateParams * Add e2e test for x/community UpdateParamsMsg proposal * Ensure new params are different * Add errors and update codec * Update changelog * Use single reused govAuthorityAddr * Add unit tests for authority and msg * Validate authority address * Update proto comment * Check for ErrInvalidSigner in invalid authority error
This commit is contained in:
		
							parent
							
								
									ae4cb15d73
								
							
						
					
					
						commit
						395b69ac2f
					
				@ -42,6 +42,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
 | 
			
		||||
- (metrics) [#1669] Add performance timing metrics to all Begin/EndBlockers
 | 
			
		||||
- (community) [#1704] Add module params
 | 
			
		||||
- (community) [#1706] Add disable inflation upgrade
 | 
			
		||||
- (community) [#1745] Enable params update via governance with `MsgUpdateParams`
 | 
			
		||||
 | 
			
		||||
### Bug Fixes
 | 
			
		||||
 | 
			
		||||
@ -292,6 +293,7 @@ the [changelog](https://github.com/cosmos/cosmos-sdk/blob/v0.38.4/CHANGELOG.md).
 | 
			
		||||
- [#257](https://github.com/Kava-Labs/kava/pulls/257) Include scripts to run
 | 
			
		||||
  large-scale simulations remotely using aws-batch
 | 
			
		||||
 | 
			
		||||
[#1745]: https://github.com/Kava-Labs/kava/pull/1745
 | 
			
		||||
[#1707]: https://github.com/Kava-Labs/kava/pull/1707
 | 
			
		||||
[#1706]: https://github.com/Kava-Labs/kava/pull/1706
 | 
			
		||||
[#1668]: https://github.com/Kava-Labs/kava/pull/1668
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								app/app.go
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								app/app.go
									
									
									
									
									
								
							@ -251,8 +251,10 @@ var (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Verify app interface at compile time
 | 
			
		||||
var _ servertypes.Application = (*App)(nil)
 | 
			
		||||
var _ servertypes.ApplicationQueryService = (*App)(nil)
 | 
			
		||||
var (
 | 
			
		||||
	_ servertypes.Application             = (*App)(nil)
 | 
			
		||||
	_ servertypes.ApplicationQueryService = (*App)(nil)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Options bundles several configuration params for an App.
 | 
			
		||||
type Options struct {
 | 
			
		||||
@ -379,6 +381,9 @@ func NewApp(
 | 
			
		||||
	tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey, feemarkettypes.TransientKey)
 | 
			
		||||
	memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
 | 
			
		||||
 | 
			
		||||
	// Authority for gov proposals, using the x/gov module account address
 | 
			
		||||
	govAuthorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName)
 | 
			
		||||
 | 
			
		||||
	app := &App{
 | 
			
		||||
		BaseApp:           bApp,
 | 
			
		||||
		legacyAmino:       legacyAmino,
 | 
			
		||||
@ -485,8 +490,7 @@ func NewApp(
 | 
			
		||||
		appCodec,
 | 
			
		||||
		homePath,
 | 
			
		||||
		app.BaseApp,
 | 
			
		||||
		// Authority
 | 
			
		||||
		authtypes.NewModuleAddress(govtypes.ModuleName).String(),
 | 
			
		||||
		govAuthorityAddr.String(),
 | 
			
		||||
	)
 | 
			
		||||
	app.evidenceKeeper = *evidencekeeper.NewKeeper(
 | 
			
		||||
		appCodec,
 | 
			
		||||
@ -507,8 +511,7 @@ func NewApp(
 | 
			
		||||
	// Create Ethermint keepers
 | 
			
		||||
	app.feeMarketKeeper = feemarketkeeper.NewKeeper(
 | 
			
		||||
		appCodec,
 | 
			
		||||
		// Authority
 | 
			
		||||
		authtypes.NewModuleAddress(govtypes.ModuleName),
 | 
			
		||||
		govAuthorityAddr,
 | 
			
		||||
		keys[feemarkettypes.StoreKey],
 | 
			
		||||
		tkeys[feemarkettypes.TransientKey],
 | 
			
		||||
		feemarketSubspace,
 | 
			
		||||
@ -525,8 +528,7 @@ func NewApp(
 | 
			
		||||
	evmBankKeeper := evmutilkeeper.NewEvmBankKeeper(app.evmutilKeeper, app.bankKeeper, app.accountKeeper)
 | 
			
		||||
	app.evmKeeper = evmkeeper.NewKeeper(
 | 
			
		||||
		appCodec, keys[evmtypes.StoreKey], tkeys[evmtypes.TransientKey],
 | 
			
		||||
		// Authority
 | 
			
		||||
		authtypes.NewModuleAddress(govtypes.ModuleName),
 | 
			
		||||
		govAuthorityAddr,
 | 
			
		||||
		app.accountKeeper, evmBankKeeper, app.stakingKeeper, app.feeMarketKeeper,
 | 
			
		||||
		nil, // precompiled contracts
 | 
			
		||||
		geth.NewEVM,
 | 
			
		||||
@ -667,6 +669,7 @@ func NewApp(
 | 
			
		||||
		&app.mintKeeper,
 | 
			
		||||
		&app.kavadistKeeper,
 | 
			
		||||
		app.stakingKeeper,
 | 
			
		||||
		govAuthorityAddr,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	app.incentiveKeeper = incentivekeeper.NewKeeper(
 | 
			
		||||
 | 
			
		||||
@ -209,6 +209,8 @@
 | 
			
		||||
- [kava/community/v1beta1/tx.proto](#kava/community/v1beta1/tx.proto)
 | 
			
		||||
    - [MsgFundCommunityPool](#kava.community.v1beta1.MsgFundCommunityPool)
 | 
			
		||||
    - [MsgFundCommunityPoolResponse](#kava.community.v1beta1.MsgFundCommunityPoolResponse)
 | 
			
		||||
    - [MsgUpdateParams](#kava.community.v1beta1.MsgUpdateParams)
 | 
			
		||||
    - [MsgUpdateParamsResponse](#kava.community.v1beta1.MsgUpdateParamsResponse)
 | 
			
		||||
  
 | 
			
		||||
    - [Msg](#kava.community.v1beta1.Msg)
 | 
			
		||||
  
 | 
			
		||||
@ -3214,6 +3216,32 @@ MsgFundCommunityPoolResponse defines the Msg/FundCommunityPool response type.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<a name="kava.community.v1beta1.MsgUpdateParams"></a>
 | 
			
		||||
 | 
			
		||||
### MsgUpdateParams
 | 
			
		||||
MsgUpdateParams allows an account to update the community module parameters.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| Field | Type | Label | Description |
 | 
			
		||||
| ----- | ---- | ----- | ----------- |
 | 
			
		||||
| `authority` | [string](#string) |  | authority is the address that controls the module (defaults to x/gov unless overwritten). |
 | 
			
		||||
| `params` | [Params](#kava.community.v1beta1.Params) |  | params defines the x/community parameters to update. |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<a name="kava.community.v1beta1.MsgUpdateParamsResponse"></a>
 | 
			
		||||
 | 
			
		||||
### MsgUpdateParamsResponse
 | 
			
		||||
MsgUpdateParamsResponse defines the Msg/UpdateParams response type.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 <!-- end messages -->
 | 
			
		||||
 | 
			
		||||
 <!-- end enums -->
 | 
			
		||||
@ -3229,6 +3257,7 @@ Msg defines the community Msg service.
 | 
			
		||||
| Method Name | Request Type | Response Type | Description | HTTP Verb | Endpoint |
 | 
			
		||||
| ----------- | ------------ | ------------- | ------------| ------- | -------- |
 | 
			
		||||
| `FundCommunityPool` | [MsgFundCommunityPool](#kava.community.v1beta1.MsgFundCommunityPool) | [MsgFundCommunityPoolResponse](#kava.community.v1beta1.MsgFundCommunityPoolResponse) | FundCommunityPool defines a method to allow an account to directly fund the community module account. | |
 | 
			
		||||
| `UpdateParams` | [MsgUpdateParams](#kava.community.v1beta1.MsgUpdateParams) | [MsgUpdateParamsResponse](#kava.community.v1beta1.MsgUpdateParamsResponse) | UpdateParams defines a method to allow an account to update the community module parameters. | |
 | 
			
		||||
 | 
			
		||||
 <!-- end services -->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,8 @@ option go_package = "github.com/kava-labs/kava/x/community/types";
 | 
			
		||||
 | 
			
		||||
// Params defines the parameters of the community module.
 | 
			
		||||
message Params {
 | 
			
		||||
  option (gogoproto.equal) = true;
 | 
			
		||||
 | 
			
		||||
  // upgrade_time_disable_inflation is the time at which to disable mint and kavadist module inflation.
 | 
			
		||||
  // If set to 0, inflation will be disabled from block 1.
 | 
			
		||||
  google.protobuf.Timestamp upgrade_time_disable_inflation = 1 [
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ package kava.community.v1beta1;
 | 
			
		||||
import "cosmos/base/v1beta1/coin.proto";
 | 
			
		||||
import "cosmos_proto/cosmos.proto";
 | 
			
		||||
import "gogoproto/gogo.proto";
 | 
			
		||||
import "kava/community/v1beta1/params.proto";
 | 
			
		||||
 | 
			
		||||
option go_package = "github.com/kava-labs/kava/x/community/types";
 | 
			
		||||
option (gogoproto.equal_all) = true;
 | 
			
		||||
@ -12,6 +13,9 @@ option (gogoproto.equal_all) = true;
 | 
			
		||||
service Msg {
 | 
			
		||||
  // FundCommunityPool defines a method to allow an account to directly fund the community module account.
 | 
			
		||||
  rpc FundCommunityPool(MsgFundCommunityPool) returns (MsgFundCommunityPoolResponse);
 | 
			
		||||
 | 
			
		||||
  // UpdateParams defines a method to allow an account to update the community module parameters.
 | 
			
		||||
  rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MsgFundCommunityPool allows an account to directly fund the community module account.
 | 
			
		||||
@ -27,3 +31,17 @@ message MsgFundCommunityPool {
 | 
			
		||||
 | 
			
		||||
// MsgFundCommunityPoolResponse defines the Msg/FundCommunityPool response type.
 | 
			
		||||
message MsgFundCommunityPoolResponse {}
 | 
			
		||||
 | 
			
		||||
// MsgUpdateParams allows an account to update the community module parameters.
 | 
			
		||||
message MsgUpdateParams {
 | 
			
		||||
  option (gogoproto.goproto_getters) = false;
 | 
			
		||||
 | 
			
		||||
  // authority is the address that controls the module (defaults to x/gov unless overwritten).
 | 
			
		||||
  string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
 | 
			
		||||
 | 
			
		||||
  // params defines the x/community parameters to update.
 | 
			
		||||
  Params params = 2 [(gogoproto.nullable) = false];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MsgUpdateParamsResponse defines the Msg/UpdateParams response type.
 | 
			
		||||
message MsgUpdateParamsResponse {}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										173
									
								
								tests/e2e/e2e_community_update_params_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								tests/e2e/e2e_community_update_params_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,173 @@
 | 
			
		||||
package e2e_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	sdkmath "cosmossdk.io/math"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
	govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
 | 
			
		||||
	govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/tests/e2e/testutil"
 | 
			
		||||
	"github.com/kava-labs/kava/tests/util"
 | 
			
		||||
	communitytypes "github.com/kava-labs/kava/x/community/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (suite *IntegrationTestSuite) TestCommunityUpdateParams_NonAuthority() {
 | 
			
		||||
	// ARRANGE
 | 
			
		||||
	// setup kava account
 | 
			
		||||
	funds := ukava(1e5) // .1 KAVA
 | 
			
		||||
	kavaAcc := suite.Kava.NewFundedAccount("community-non-authority", sdk.NewCoins(funds))
 | 
			
		||||
 | 
			
		||||
	gasLimit := int64(2e5)
 | 
			
		||||
	fee := ukava(200)
 | 
			
		||||
 | 
			
		||||
	msg := communitytypes.NewMsgUpdateParams(
 | 
			
		||||
		kavaAcc.SdkAddress,
 | 
			
		||||
		communitytypes.DefaultParams(),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// ACT
 | 
			
		||||
	req := util.KavaMsgRequest{
 | 
			
		||||
		Msgs:      []sdk.Msg{&msg},
 | 
			
		||||
		GasLimit:  uint64(gasLimit),
 | 
			
		||||
		FeeAmount: sdk.NewCoins(fee),
 | 
			
		||||
		Memo:      "this is a failure!",
 | 
			
		||||
	}
 | 
			
		||||
	res := kavaAcc.SignAndBroadcastKavaTx(req)
 | 
			
		||||
 | 
			
		||||
	// ASSERT
 | 
			
		||||
	_, err := util.WaitForSdkTxCommit(suite.Kava.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.Kava.Gov.Params(context.Background(), &govv1.QueryParamsRequest{
 | 
			
		||||
		ParamsType: govv1.ParamDeposit,
 | 
			
		||||
	})
 | 
			
		||||
	suite.NoError(err)
 | 
			
		||||
 | 
			
		||||
	// Check initial params
 | 
			
		||||
	communityParamsResInitial, err := suite.Kava.Community.Params(
 | 
			
		||||
		context.Background(),
 | 
			
		||||
		&communitytypes.QueryParamsRequest{},
 | 
			
		||||
	)
 | 
			
		||||
	suite.Require().NoError(err)
 | 
			
		||||
 | 
			
		||||
	// setup kava account
 | 
			
		||||
	// .1 KAVA + min deposit amount for proposal
 | 
			
		||||
	funds := sdk.NewCoins(ukava(1e5)).Add(govParamsRes.DepositParams.MinDeposit...)
 | 
			
		||||
	kavaAcc := suite.Kava.NewFundedAccount("community-update-params", funds)
 | 
			
		||||
 | 
			
		||||
	gasLimit := int64(2e5)
 | 
			
		||||
	fee := ukava(200)
 | 
			
		||||
 | 
			
		||||
	upgradeTime := time.Now().Add(24 * time.Hour).UTC()
 | 
			
		||||
 | 
			
		||||
	// 1. Proposal
 | 
			
		||||
	updateParamsMsg := communitytypes.NewMsgUpdateParams(
 | 
			
		||||
		authtypes.NewModuleAddress(govtypes.ModuleName), // authority
 | 
			
		||||
		communitytypes.NewParams(
 | 
			
		||||
			upgradeTime,
 | 
			
		||||
			sdkmath.LegacyNewDec(1111), // stakingRewardsPerSecond
 | 
			
		||||
			sdkmath.LegacyNewDec(2222), // 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.DepositParams.MinDeposit,
 | 
			
		||||
		kavaAcc.SdkAddress.String(),
 | 
			
		||||
		"community-update-params",
 | 
			
		||||
	)
 | 
			
		||||
	suite.NoError(err)
 | 
			
		||||
 | 
			
		||||
	req := util.KavaMsgRequest{
 | 
			
		||||
		Msgs:      []sdk.Msg{proposalMsg},
 | 
			
		||||
		GasLimit:  uint64(gasLimit),
 | 
			
		||||
		FeeAmount: sdk.NewCoins(fee),
 | 
			
		||||
		Memo:      "this is a proposal please accept me",
 | 
			
		||||
	}
 | 
			
		||||
	res := kavaAcc.SignAndBroadcastKavaTx(req)
 | 
			
		||||
	suite.Require().NoError(res.Err)
 | 
			
		||||
 | 
			
		||||
	// Wait for proposal to be submitted
 | 
			
		||||
	txRes, err := util.WaitForSdkTxCommit(suite.Kava.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.Kava.GetAccount(testutil.FundedAccountName)
 | 
			
		||||
	voteMsg := govv1.NewMsgVote(
 | 
			
		||||
		whale.SdkAddress,
 | 
			
		||||
		govRes.ProposalId,
 | 
			
		||||
		govv1.OptionYes,
 | 
			
		||||
		"",
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	voteReq := util.KavaMsgRequest{
 | 
			
		||||
		Msgs:      []sdk.Msg{voteMsg},
 | 
			
		||||
		GasLimit:  uint64(gasLimit),
 | 
			
		||||
		FeeAmount: sdk.NewCoins(fee),
 | 
			
		||||
		Memo:      "voting",
 | 
			
		||||
	}
 | 
			
		||||
	voteRes := whale.SignAndBroadcastKavaTx(voteReq)
 | 
			
		||||
	suite.Require().NoError(voteRes.Err)
 | 
			
		||||
 | 
			
		||||
	_, err = util.WaitForSdkTxCommit(suite.Kava.Tx, voteRes.Result.TxHash, 6*time.Second)
 | 
			
		||||
	suite.Require().NoError(err)
 | 
			
		||||
 | 
			
		||||
	// 3. Wait until proposal passes
 | 
			
		||||
	suite.Require().Eventually(func() bool {
 | 
			
		||||
		proposalRes, err := suite.Kava.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.Kava.Community.Params(
 | 
			
		||||
		context.Background(),
 | 
			
		||||
		&communitytypes.QueryParamsRequest{},
 | 
			
		||||
	)
 | 
			
		||||
	suite.Require().NoError(err)
 | 
			
		||||
 | 
			
		||||
	suite.Equal(updateParamsMsg.Params, communityParamsRes.Params)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
	suite.Kava.EncodingConfig.Marshaler.MustUnmarshal(txResBytes, &txMsgData)
 | 
			
		||||
	suite.T().Logf("txData.MsgResponses: %v", txMsgData.MsgResponses)
 | 
			
		||||
 | 
			
		||||
	// Parse MsgResponse
 | 
			
		||||
	suite.Kava.EncodingConfig.Marshaler.MustUnmarshal(txMsgData.MsgResponses[0].Value, ptr)
 | 
			
		||||
	suite.Require().NoError(err)
 | 
			
		||||
}
 | 
			
		||||
@ -14,6 +14,7 @@ import (
 | 
			
		||||
	txtypes "github.com/cosmos/cosmos-sdk/types/tx"
 | 
			
		||||
	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
 | 
			
		||||
	govv1types "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
 | 
			
		||||
	upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/ethereum/go-ethereum"
 | 
			
		||||
@ -55,6 +56,7 @@ type Chain struct {
 | 
			
		||||
	Earn      earntypes.QueryClient
 | 
			
		||||
	Evm       evmtypes.QueryClient
 | 
			
		||||
	Evmutil   evmutiltypes.QueryClient
 | 
			
		||||
	Gov       govv1types.QueryClient
 | 
			
		||||
	Tm        tmservice.ServiceClient
 | 
			
		||||
	Tx        txtypes.ServiceClient
 | 
			
		||||
	Upgrade   upgradetypes.QueryClient
 | 
			
		||||
@ -91,6 +93,7 @@ func NewChain(t *testing.T, details *runner.ChainDetails, fundedAccountMnemonic
 | 
			
		||||
	chain.Earn = earntypes.NewQueryClient(grpcConn)
 | 
			
		||||
	chain.Evm = evmtypes.NewQueryClient(grpcConn)
 | 
			
		||||
	chain.Evmutil = evmutiltypes.NewQueryClient(grpcConn)
 | 
			
		||||
	chain.Gov = govv1types.NewQueryClient(grpcConn)
 | 
			
		||||
	chain.Tm = tmservice.NewServiceClient(grpcConn)
 | 
			
		||||
	chain.Tx = txtypes.NewServiceClient(grpcConn)
 | 
			
		||||
	chain.Upgrade = upgradetypes.NewQueryClient(grpcConn)
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,10 @@ type Keeper struct {
 | 
			
		||||
	kavadistKeeper types.KavadistKeeper
 | 
			
		||||
	stakingKeeper  types.StakingKeeper
 | 
			
		||||
 | 
			
		||||
	// the address capable of executing a MsgUpdateParams message. Typically, this
 | 
			
		||||
	// should be the x/gov module account.
 | 
			
		||||
	authority sdk.AccAddress
 | 
			
		||||
 | 
			
		||||
	legacyCommunityPoolAddress sdk.AccAddress
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -40,6 +44,7 @@ func NewKeeper(
 | 
			
		||||
	mk types.MintKeeper,
 | 
			
		||||
	kk types.KavadistKeeper,
 | 
			
		||||
	sk types.StakingKeeper,
 | 
			
		||||
	authority sdk.AccAddress,
 | 
			
		||||
) Keeper {
 | 
			
		||||
	// ensure community module account is set
 | 
			
		||||
	addr := ak.GetModuleAddress(types.ModuleAccountName)
 | 
			
		||||
@ -50,6 +55,9 @@ func NewKeeper(
 | 
			
		||||
	if addr == nil {
 | 
			
		||||
		panic("legacy community pool address not found")
 | 
			
		||||
	}
 | 
			
		||||
	if err := sdk.VerifyAddressFormat(authority); err != nil {
 | 
			
		||||
		panic(fmt.Sprintf("invalid authority address: %s", err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return Keeper{
 | 
			
		||||
		key: key,
 | 
			
		||||
@ -64,10 +72,16 @@ func NewKeeper(
 | 
			
		||||
		stakingKeeper:  sk,
 | 
			
		||||
		moduleAddress:  addr,
 | 
			
		||||
 | 
			
		||||
		authority:                  authority,
 | 
			
		||||
		legacyCommunityPoolAddress: legacyAddr,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetAuthority returns the x/community module's authority.
 | 
			
		||||
func (k Keeper) GetAuthority() sdk.AccAddress {
 | 
			
		||||
	return k.authority
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Logger returns a module-specific logger.
 | 
			
		||||
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
 | 
			
		||||
	return ctx.Logger().With("module", "x/"+types.ModuleName)
 | 
			
		||||
 | 
			
		||||
@ -1,13 +1,18 @@
 | 
			
		||||
package keeper_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	sdkmath "cosmossdk.io/math"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/types/address"
 | 
			
		||||
	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
	govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
 | 
			
		||||
	"github.com/stretchr/testify/suite"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/x/community/keeper"
 | 
			
		||||
	"github.com/kava-labs/kava/x/community/testutil"
 | 
			
		||||
	"github.com/kava-labs/kava/x/community/types"
 | 
			
		||||
)
 | 
			
		||||
@ -89,3 +94,95 @@ func (suite *KeeperTestSuite) TestGetAndSetStakingRewardsState() {
 | 
			
		||||
 | 
			
		||||
	suite.Equal(validParams, keeper.GetStakingRewardsState(suite.Ctx), "expected fetched state to equal set state")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *KeeperTestSuite) TestGetAuthority_Default() {
 | 
			
		||||
	suite.Equal(
 | 
			
		||||
		authtypes.NewModuleAddress(govtypes.ModuleName),
 | 
			
		||||
		suite.Keeper.GetAuthority(),
 | 
			
		||||
		"expected fetched authority to equal x/gov address",
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *KeeperTestSuite) TestGetAuthority_Any() {
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name      string
 | 
			
		||||
		authority sdk.AccAddress
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name:      "gov",
 | 
			
		||||
			authority: authtypes.NewModuleAddress(govtypes.ModuleName),
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:      "random",
 | 
			
		||||
			authority: sdk.AccAddress("random"),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range tests {
 | 
			
		||||
		suite.Run(tc.name, func() {
 | 
			
		||||
			suite.NotPanics(func() {
 | 
			
		||||
				suite.Keeper = keeper.NewKeeper(
 | 
			
		||||
					suite.App.AppCodec(),
 | 
			
		||||
					suite.App.GetKVStoreKey(types.StoreKey),
 | 
			
		||||
					suite.App.GetAccountKeeper(),
 | 
			
		||||
					suite.App.GetBankKeeper(),
 | 
			
		||||
					suite.App.GetCDPKeeper(),
 | 
			
		||||
					suite.App.GetDistrKeeper(),
 | 
			
		||||
					suite.App.GetHardKeeper(),
 | 
			
		||||
					suite.App.GetMintKeeper(),
 | 
			
		||||
					suite.App.GetKavadistKeeper(),
 | 
			
		||||
					suite.App.GetStakingKeeper(),
 | 
			
		||||
					tc.authority,
 | 
			
		||||
				)
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
			suite.Equalf(
 | 
			
		||||
				tc.authority,
 | 
			
		||||
				suite.Keeper.GetAuthority(),
 | 
			
		||||
				"expected fetched authority to equal %s address",
 | 
			
		||||
				tc.authority,
 | 
			
		||||
			)
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *KeeperTestSuite) TestNewKeeper_InvalidAuthority() {
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		name      string
 | 
			
		||||
		authority sdk.AccAddress
 | 
			
		||||
		panicStr  string
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name:      "empty",
 | 
			
		||||
			authority: sdk.AccAddress{},
 | 
			
		||||
			panicStr:  "invalid authority address: addresses cannot be empty: unknown address",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:      "too long",
 | 
			
		||||
			authority: sdk.AccAddress(strings.Repeat("a", address.MaxAddrLen+1)),
 | 
			
		||||
			panicStr:  "invalid authority address: address max length is 255, got 256: unknown address",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range tests {
 | 
			
		||||
		suite.Run(tc.name, func() {
 | 
			
		||||
			suite.PanicsWithValue(
 | 
			
		||||
				tc.panicStr,
 | 
			
		||||
				func() {
 | 
			
		||||
					suite.Keeper = keeper.NewKeeper(
 | 
			
		||||
						suite.App.AppCodec(),
 | 
			
		||||
						suite.App.GetKVStoreKey(types.StoreKey),
 | 
			
		||||
						suite.App.GetAccountKeeper(),
 | 
			
		||||
						suite.App.GetBankKeeper(),
 | 
			
		||||
						suite.App.GetCDPKeeper(),
 | 
			
		||||
						suite.App.GetDistrKeeper(),
 | 
			
		||||
						suite.App.GetHardKeeper(),
 | 
			
		||||
						suite.App.GetMintKeeper(),
 | 
			
		||||
						suite.App.GetKavadistKeeper(),
 | 
			
		||||
						suite.App.GetStakingKeeper(),
 | 
			
		||||
						tc.authority,
 | 
			
		||||
					)
 | 
			
		||||
				})
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,9 @@ package keeper
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"cosmossdk.io/errors"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/x/community/types"
 | 
			
		||||
)
 | 
			
		||||
@ -47,3 +49,28 @@ func (s msgServer) FundCommunityPool(goCtx context.Context, msg *types.MsgFundCo
 | 
			
		||||
 | 
			
		||||
	return &types.MsgFundCommunityPoolResponse{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UpdateParams handles UpdateParams msgs.
 | 
			
		||||
func (s msgServer) UpdateParams(
 | 
			
		||||
	goCtx context.Context,
 | 
			
		||||
	msg *types.MsgUpdateParams,
 | 
			
		||||
) (*types.MsgUpdateParamsResponse, error) {
 | 
			
		||||
	ctx := sdk.UnwrapSDKContext(goCtx)
 | 
			
		||||
 | 
			
		||||
	if s.keeper.GetAuthority().String() != msg.Authority {
 | 
			
		||||
		return nil, errors.Wrapf(
 | 
			
		||||
			govtypes.ErrInvalidSigner,
 | 
			
		||||
			"invalid authority; expected %s, got %s",
 | 
			
		||||
			s.keeper.GetAuthority(),
 | 
			
		||||
			msg.Authority,
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := msg.Params.Validate(); err != nil {
 | 
			
		||||
		return nil, errors.Wrap(types.ErrInvalidParams, err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s.keeper.SetParams(ctx, msg.Params)
 | 
			
		||||
 | 
			
		||||
	return &types.MsgUpdateParamsResponse{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,8 @@ import (
 | 
			
		||||
 | 
			
		||||
	sdkmath "cosmossdk.io/math"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
 | 
			
		||||
	govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
 | 
			
		||||
	"github.com/stretchr/testify/suite"
 | 
			
		||||
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
@ -110,3 +112,59 @@ func (suite *msgServerTestSuite) TestMsgFundCommunityPool() {
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (suite *msgServerTestSuite) TestMsgUpdateParams() {
 | 
			
		||||
	govAddr := authtypes.NewModuleAddress(govtypes.ModuleName)
 | 
			
		||||
 | 
			
		||||
	testCases := []struct {
 | 
			
		||||
		name          string
 | 
			
		||||
		msg           types.MsgUpdateParams
 | 
			
		||||
		expectedError error
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name: "valid",
 | 
			
		||||
			msg: types.MsgUpdateParams{
 | 
			
		||||
				Authority: govAddr.String(),
 | 
			
		||||
				Params:    types.DefaultParams(),
 | 
			
		||||
			},
 | 
			
		||||
			expectedError: nil,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "invalid - bad authority",
 | 
			
		||||
			msg: types.MsgUpdateParams{
 | 
			
		||||
				Authority: sdk.AccAddress{1, 2, 3}.String(),
 | 
			
		||||
				Params:    types.DefaultParams(),
 | 
			
		||||
			},
 | 
			
		||||
			expectedError: govtypes.ErrInvalidSigner,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "invalid - empty authority",
 | 
			
		||||
			msg: types.MsgUpdateParams{
 | 
			
		||||
				Authority: "",
 | 
			
		||||
				Params:    types.DefaultParams(),
 | 
			
		||||
			},
 | 
			
		||||
			expectedError: govtypes.ErrInvalidSigner,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "invalid - parameters",
 | 
			
		||||
			msg: types.MsgUpdateParams{
 | 
			
		||||
				Authority: govAddr.String(),
 | 
			
		||||
				Params:    types.Params{},
 | 
			
		||||
			},
 | 
			
		||||
			expectedError: types.ErrInvalidParams,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testCases {
 | 
			
		||||
		suite.Run(tc.name, func() {
 | 
			
		||||
			suite.SetupTest()
 | 
			
		||||
 | 
			
		||||
			_, err := suite.msgServer.UpdateParams(sdk.WrapSDKContext(suite.Ctx), &tc.msg)
 | 
			
		||||
			if tc.expectedError == nil {
 | 
			
		||||
				suite.NoError(err)
 | 
			
		||||
			} else {
 | 
			
		||||
				suite.ErrorIs(err, tc.expectedError)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@ package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec/legacy"
 | 
			
		||||
	"github.com/cosmos/cosmos-sdk/codec/types"
 | 
			
		||||
	cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
@ -12,7 +13,9 @@ import (
 | 
			
		||||
 | 
			
		||||
// RegisterLegacyAminoCodec registers all the necessary types and interfaces for the module.
 | 
			
		||||
func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
 | 
			
		||||
	cdc.RegisterConcrete(&MsgFundCommunityPool{}, "community/MsgFundCommunityPool", nil)
 | 
			
		||||
	legacy.RegisterAminoMsg(cdc, &MsgFundCommunityPool{}, "community/MsgFundCommunityPool")
 | 
			
		||||
	legacy.RegisterAminoMsg(cdc, &MsgUpdateParams{}, "community/MsgUpdateParams")
 | 
			
		||||
 | 
			
		||||
	cdc.RegisterConcrete(&CommunityPoolLendDepositProposal{}, "kava/CommunityPoolLendDepositProposal", nil)
 | 
			
		||||
	cdc.RegisterConcrete(&CommunityPoolLendWithdrawProposal{}, "kava/CommunityPoolLendWithdrawProposal", nil)
 | 
			
		||||
	cdc.RegisterConcrete(&CommunityCDPRepayDebtProposal{}, "kava/CommunityCDPRepayDebtProposal", nil)
 | 
			
		||||
@ -24,6 +27,7 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
 | 
			
		||||
func RegisterInterfaces(registry types.InterfaceRegistry) {
 | 
			
		||||
	registry.RegisterImplementations((*sdk.Msg)(nil),
 | 
			
		||||
		&MsgFundCommunityPool{},
 | 
			
		||||
		&MsgUpdateParams{},
 | 
			
		||||
	)
 | 
			
		||||
	registry.RegisterImplementations((*govv1beta1.Content)(nil),
 | 
			
		||||
		&CommunityPoolLendDepositProposal{},
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										5
									
								
								x/community/types/errors.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								x/community/types/errors.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import errorsmod "cosmossdk.io/errors"
 | 
			
		||||
 | 
			
		||||
var ErrInvalidParams = errorsmod.Register(ModuleName, 1, "invalid params")
 | 
			
		||||
@ -11,6 +11,8 @@ import (
 | 
			
		||||
var (
 | 
			
		||||
	_ sdk.Msg            = &MsgFundCommunityPool{}
 | 
			
		||||
	_ legacytx.LegacyMsg = &MsgFundCommunityPool{}
 | 
			
		||||
	_ sdk.Msg            = &MsgUpdateParams{}
 | 
			
		||||
	_ legacytx.LegacyMsg = &MsgUpdateParams{}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewMsgFundCommunityPool returns a new MsgFundCommunityPool
 | 
			
		||||
@ -55,3 +57,46 @@ func (msg MsgFundCommunityPool) GetSigners() []sdk.AccAddress {
 | 
			
		||||
	}
 | 
			
		||||
	return []sdk.AccAddress{depositor}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewMsgUpdateParams returns a new MsgUpdateParams
 | 
			
		||||
func NewMsgUpdateParams(authority sdk.AccAddress, params Params) MsgUpdateParams {
 | 
			
		||||
	return MsgUpdateParams{
 | 
			
		||||
		Authority: authority.String(),
 | 
			
		||||
		Params:    params,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Route return the message type used for routing the message.
 | 
			
		||||
func (msg MsgUpdateParams) Route() string { return ModuleName }
 | 
			
		||||
 | 
			
		||||
// Type returns a human-readable string for the message, intended for utilization within tags.
 | 
			
		||||
func (msg MsgUpdateParams) Type() string { return sdk.MsgTypeURL(&msg) }
 | 
			
		||||
 | 
			
		||||
// ValidateBasic does a simple validation check that doesn't require access to any other information.
 | 
			
		||||
func (msg MsgUpdateParams) ValidateBasic() error {
 | 
			
		||||
	_, err := sdk.AccAddressFromBech32(msg.Authority)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errorsmod.Wrap(sdkerrors.ErrInvalidAddress, err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := msg.Params.Validate(); err != nil {
 | 
			
		||||
		return errorsmod.Wrap(ErrInvalidParams, err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSignBytes gets the canonical byte representation of the Msg.
 | 
			
		||||
func (msg MsgUpdateParams) GetSignBytes() []byte {
 | 
			
		||||
	bz := ModuleCdc.MustMarshalJSON(&msg)
 | 
			
		||||
	return sdk.MustSortJSON(bz)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSigners returns the addresses of signers that must sign.
 | 
			
		||||
func (msg MsgUpdateParams) GetSigners() []sdk.AccAddress {
 | 
			
		||||
	depositor, err := sdk.AccAddressFromBech32(msg.Authority)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	return []sdk.AccAddress{depositor}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ import (
 | 
			
		||||
 | 
			
		||||
	sdkmath "cosmossdk.io/math"
 | 
			
		||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
			
		||||
	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
 | 
			
		||||
	"github.com/kava-labs/kava/app"
 | 
			
		||||
	"github.com/kava-labs/kava/x/community/types"
 | 
			
		||||
)
 | 
			
		||||
@ -74,6 +75,55 @@ func TestFundCommunityPool_ValidateBasic(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMsgUpdateParams_ValidateBasic(t *testing.T) {
 | 
			
		||||
	testCases := []struct {
 | 
			
		||||
		name        string
 | 
			
		||||
		message     types.MsgUpdateParams
 | 
			
		||||
		expectedErr error
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name:        "valid message",
 | 
			
		||||
			message:     types.NewMsgUpdateParams(app.RandomAddress(), types.DefaultParams()),
 | 
			
		||||
			expectedErr: nil,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "invalid - bad authority",
 | 
			
		||||
			message: types.MsgUpdateParams{
 | 
			
		||||
				Authority: "not-an-address",
 | 
			
		||||
				Params:    types.DefaultParams(),
 | 
			
		||||
			},
 | 
			
		||||
			expectedErr: sdkerrors.ErrInvalidAddress,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "invalid - empty authority",
 | 
			
		||||
			message: types.MsgUpdateParams{
 | 
			
		||||
				Authority: "",
 | 
			
		||||
				Params:    types.DefaultParams(),
 | 
			
		||||
			},
 | 
			
		||||
			expectedErr: sdkerrors.ErrInvalidAddress,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "invalid - invalid params",
 | 
			
		||||
			message: types.MsgUpdateParams{
 | 
			
		||||
				Authority: app.RandomAddress().String(),
 | 
			
		||||
				Params:    types.Params{},
 | 
			
		||||
			},
 | 
			
		||||
			expectedErr: types.ErrInvalidParams,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testCases {
 | 
			
		||||
		t.Run(tc.name, func(t *testing.T) {
 | 
			
		||||
			err := tc.message.ValidateBasic()
 | 
			
		||||
			if tc.expectedErr == nil {
 | 
			
		||||
				require.NoError(t, err)
 | 
			
		||||
			} else {
 | 
			
		||||
				require.ErrorIs(t, err, tc.expectedErr)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestFundCommunityPool_GetSigners(t *testing.T) {
 | 
			
		||||
	t.Run("valid", func(t *testing.T) {
 | 
			
		||||
		address := app.RandomAddress()
 | 
			
		||||
@ -92,3 +142,22 @@ func TestFundCommunityPool_GetSigners(t *testing.T) {
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMsgUpdateParams_GetSigners(t *testing.T) {
 | 
			
		||||
	t.Run("valid", func(t *testing.T) {
 | 
			
		||||
		address := app.RandomAddress()
 | 
			
		||||
		signers := types.MsgUpdateParams{
 | 
			
		||||
			Authority: address.String(),
 | 
			
		||||
		}.GetSigners()
 | 
			
		||||
		require.Len(t, signers, 1)
 | 
			
		||||
		require.Equal(t, address, signers[0])
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	t.Run("panics when depositor is invalid", func(t *testing.T) {
 | 
			
		||||
		require.Panics(t, func() {
 | 
			
		||||
			types.MsgUpdateParams{
 | 
			
		||||
				Authority: "not-an-address",
 | 
			
		||||
			}.GetSigners()
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -90,33 +90,64 @@ func init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_0a48475520900507 = []byte{
 | 
			
		||||
	// 373 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xc1, 0x4a, 0xc3, 0x30,
 | 
			
		||||
	0x18, 0xc7, 0x9b, 0x09, 0x43, 0xeb, 0xad, 0x88, 0xce, 0x0e, 0xda, 0xa1, 0x08, 0x83, 0xb1, 0x84,
 | 
			
		||||
	0xe9, 0x1b, 0x8c, 0x79, 0x10, 0x3c, 0x8c, 0xcd, 0x93, 0x97, 0x90, 0xb6, 0x59, 0x16, 0xd6, 0x36,
 | 
			
		||||
	0xa5, 0x49, 0xa7, 0x7b, 0x08, 0x61, 0x0f, 0xe3, 0x43, 0xec, 0x38, 0x3c, 0x89, 0x87, 0x29, 0xdb,
 | 
			
		||||
	0x23, 0xf8, 0x02, 0xd2, 0xa6, 0x93, 0x09, 0xe2, 0xc1, 0xdb, 0xf7, 0x7d, 0xf9, 0xe7, 0x97, 0xef,
 | 
			
		||||
	0x9f, 0xef, 0x33, 0xcf, 0x27, 0x64, 0x4a, 0x90, 0x2f, 0xa2, 0x28, 0x8b, 0xb9, 0x9a, 0xa1, 0x69,
 | 
			
		||||
	0xc7, 0xa3, 0x8a, 0x74, 0x50, 0x42, 0x52, 0x12, 0x49, 0x98, 0xa4, 0x42, 0x09, 0xeb, 0x38, 0x17,
 | 
			
		||||
	0xc1, 0x6f, 0x11, 0x2c, 0x45, 0xf6, 0xa9, 0x2f, 0x64, 0x24, 0x24, 0x2e, 0x54, 0x48, 0x27, 0xfa,
 | 
			
		||||
	0x8a, 0x7d, 0xc4, 0x04, 0x13, 0xba, 0x9e, 0x47, 0x65, 0xd5, 0x65, 0x42, 0xb0, 0x90, 0xa2, 0x22,
 | 
			
		||||
	0xf3, 0xb2, 0x11, 0x52, 0x3c, 0xa2, 0x52, 0x91, 0x28, 0xd1, 0x82, 0xb3, 0xcf, 0x8a, 0x59, 0xed,
 | 
			
		||||
	0x17, 0x4f, 0x5b, 0xdc, 0x74, 0xb2, 0x84, 0xa5, 0x24, 0xa0, 0x38, 0x57, 0xe1, 0x80, 0x4b, 0xe2,
 | 
			
		||||
	0x85, 0x14, 0xf3, 0x78, 0x14, 0x12, 0xc5, 0x45, 0x5c, 0x03, 0x0d, 0xd0, 0x3c, 0xbc, 0xb4, 0xa1,
 | 
			
		||||
	0x86, 0xc2, 0x2d, 0x14, 0xde, 0x6d, 0xa1, 0xdd, 0xfd, 0xc5, 0xca, 0x35, 0xe6, 0xef, 0x2e, 0x18,
 | 
			
		||||
	0xd4, 0x4b, 0x56, 0x7e, 0xd6, 0xd3, 0xa4, 0x9b, 0x2d, 0xc8, 0x8a, 0x4d, 0x5b, 0x2a, 0x32, 0xe1,
 | 
			
		||||
	0x31, 0xc3, 0x29, 0x7d, 0x20, 0x69, 0x20, 0x71, 0x42, 0x53, 0x2c, 0xa9, 0x2f, 0xe2, 0xa0, 0x56,
 | 
			
		||||
	0x69, 0x80, 0xe6, 0x41, 0xb7, 0x93, 0xa3, 0xde, 0x56, 0x6e, 0x5d, 0xdb, 0x94, 0xc1, 0x04, 0x72,
 | 
			
		||||
	0x81, 0x22, 0xa2, 0xc6, 0xf0, 0x96, 0x32, 0xe2, 0xcf, 0x7a, 0xd4, 0x7f, 0x79, 0x6e, 0x9b, 0xe5,
 | 
			
		||||
	0x2f, 0xf4, 0xa8, 0x3f, 0x38, 0x29, 0xa1, 0x03, 0xcd, 0xec, 0xd3, 0x74, 0x58, 0x10, 0xad, 0x27,
 | 
			
		||||
	0x60, 0xb6, 0x7e, 0x78, 0x93, 0x54, 0xe1, 0x3f, 0x3a, 0xd8, 0xfb, 0x6f, 0x07, 0x17, 0x3b, 0xae,
 | 
			
		||||
	0x87, 0x54, 0x0d, 0x7f, 0xef, 0xa7, 0x7b, 0xbd, 0x58, 0x3b, 0x60, 0xb9, 0x76, 0xc0, 0xc7, 0xda,
 | 
			
		||||
	0x01, 0xf3, 0x8d, 0x63, 0x2c, 0x37, 0x8e, 0xf1, 0xba, 0x71, 0x8c, 0xfb, 0x16, 0xe3, 0x6a, 0x9c,
 | 
			
		||||
	0x79, 0xf9, 0xec, 0x51, 0xbe, 0x04, 0xed, 0x90, 0x78, 0xb2, 0x88, 0xd0, 0xe3, 0xce, 0xd6, 0xa8,
 | 
			
		||||
	0x59, 0x42, 0xa5, 0x57, 0x2d, 0x26, 0x70, 0xf5, 0x15, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x51, 0x6e,
 | 
			
		||||
	0xa4, 0x54, 0x02, 0x00, 0x00,
 | 
			
		||||
	// 386 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0x41, 0x4b, 0xe3, 0x40,
 | 
			
		||||
	0x14, 0x80, 0x33, 0xdd, 0xa5, 0xec, 0x66, 0x6f, 0x61, 0xd9, 0xad, 0x29, 0x24, 0x45, 0x11, 0x0a,
 | 
			
		||||
	0xa5, 0x33, 0x54, 0x6f, 0x1e, 0x4b, 0x3d, 0x08, 0x1e, 0x4a, 0xeb, 0xc9, 0xcb, 0x30, 0x49, 0xa6,
 | 
			
		||||
	0xd3, 0xa1, 0x49, 0x26, 0x64, 0x26, 0xd5, 0xfe, 0x08, 0xa1, 0x3f, 0xc1, 0x1f, 0xe1, 0x8f, 0xe8,
 | 
			
		||||
	0xb1, 0x78, 0x12, 0x0f, 0x55, 0xda, 0x8b, 0x7f, 0xc1, 0x9b, 0x24, 0x93, 0x4a, 0x05, 0xf1, 0xe0,
 | 
			
		||||
	0xed, 0xbd, 0x97, 0x2f, 0xdf, 0xbc, 0x37, 0xf3, 0xcc, 0x83, 0x09, 0x99, 0x12, 0xe4, 0x8b, 0x28,
 | 
			
		||||
	0xca, 0x62, 0xae, 0x66, 0x68, 0xda, 0xf1, 0xa8, 0x22, 0x1d, 0x94, 0x90, 0x94, 0x44, 0x12, 0x26,
 | 
			
		||||
	0xa9, 0x50, 0xc2, 0xfa, 0x97, 0x43, 0xf0, 0x1d, 0x82, 0x25, 0x64, 0xef, 0xf9, 0x42, 0x46, 0x42,
 | 
			
		||||
	0xe2, 0x82, 0x42, 0x3a, 0xd1, 0xbf, 0xd8, 0x7f, 0x99, 0x60, 0x42, 0xd7, 0xf3, 0xa8, 0xac, 0xba,
 | 
			
		||||
	0x4c, 0x08, 0x16, 0x52, 0x54, 0x64, 0x5e, 0x36, 0x42, 0x8a, 0x47, 0x54, 0x2a, 0x12, 0x25, 0x1a,
 | 
			
		||||
	0xd8, 0x7f, 0xad, 0x98, 0xd5, 0x7e, 0x71, 0xb4, 0xc5, 0x4d, 0x27, 0x4b, 0x58, 0x4a, 0x02, 0x8a,
 | 
			
		||||
	0x73, 0x0a, 0x07, 0x5c, 0x12, 0x2f, 0xa4, 0x98, 0xc7, 0xa3, 0x90, 0x28, 0x2e, 0xe2, 0x1a, 0x68,
 | 
			
		||||
	0x80, 0xe6, 0x9f, 0x23, 0x1b, 0x6a, 0x29, 0xdc, 0x4a, 0xe1, 0xc5, 0x56, 0xda, 0xfd, 0xb5, 0x58,
 | 
			
		||||
	0xb9, 0xc6, 0xfc, 0xc9, 0x05, 0x83, 0x7a, 0xe9, 0xca, 0xbf, 0xf5, 0xb4, 0xe9, 0x6c, 0x2b, 0xb2,
 | 
			
		||||
	0x62, 0xd3, 0x96, 0x8a, 0x4c, 0x78, 0xcc, 0x70, 0x4a, 0xaf, 0x48, 0x1a, 0x48, 0x9c, 0xd0, 0x14,
 | 
			
		||||
	0x4b, 0xea, 0x8b, 0x38, 0xa8, 0x55, 0x1a, 0xa0, 0xf9, 0xbb, 0xdb, 0xc9, 0x55, 0x8f, 0x2b, 0xb7,
 | 
			
		||||
	0xae, 0xc7, 0x94, 0xc1, 0x04, 0x72, 0x81, 0x22, 0xa2, 0xc6, 0xf0, 0x9c, 0x32, 0xe2, 0xcf, 0x7a,
 | 
			
		||||
	0xd4, 0xbf, 0xbf, 0x6b, 0x9b, 0xe5, 0x2d, 0xf4, 0xa8, 0x3f, 0xf8, 0x5f, 0x4a, 0x07, 0xda, 0xd9,
 | 
			
		||||
	0xa7, 0xe9, 0xb0, 0x30, 0x5a, 0x37, 0xc0, 0x6c, 0x7d, 0x98, 0x4d, 0x52, 0x85, 0xbf, 0xe8, 0xe0,
 | 
			
		||||
	0xc7, 0x77, 0x3b, 0x38, 0xdc, 0x99, 0x7a, 0x48, 0xd5, 0xf0, 0xf3, 0x7e, 0x4e, 0x7e, 0xbe, 0xdc,
 | 
			
		||||
	0xba, 0xa0, 0x7b, 0xba, 0x58, 0x3b, 0x60, 0xb9, 0x76, 0xc0, 0xf3, 0xda, 0x01, 0xf3, 0x8d, 0x63,
 | 
			
		||||
	0x2c, 0x37, 0x8e, 0xf1, 0xb0, 0x71, 0x8c, 0xcb, 0x16, 0xe3, 0x6a, 0x9c, 0x79, 0xf9, 0x06, 0xa0,
 | 
			
		||||
	0x7c, 0x15, 0xda, 0x21, 0xf1, 0x64, 0x11, 0xa1, 0xeb, 0x9d, 0xdd, 0x51, 0xb3, 0x84, 0x4a, 0xaf,
 | 
			
		||||
	0x5a, 0xbc, 0xc3, 0xf1, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0x03, 0x78, 0xe5, 0x5a, 0x02,
 | 
			
		||||
	0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *Params) Equal(that interface{}) bool {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*Params)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(Params)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !this.UpgradeTimeDisableInflation.Equal(that1.UpgradeTimeDisableInflation) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !this.StakingRewardsPerSecond.Equal(that1.StakingRewardsPerSecond) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !this.UpgradeTimeSetStakingRewardsPerSecond.Equal(that1.UpgradeTimeSetStakingRewardsPerSecond) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
func (m *Params) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
 | 
			
		||||
@ -107,37 +107,123 @@ func (m *MsgFundCommunityPoolResponse) XXX_DiscardUnknown() {
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_MsgFundCommunityPoolResponse proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
// MsgUpdateParams allows an account to update the community module parameters.
 | 
			
		||||
type MsgUpdateParams struct {
 | 
			
		||||
	// authority is the address that controls the module (defaults to x/gov unless overwritten).
 | 
			
		||||
	Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"`
 | 
			
		||||
	// params defines the x/community parameters to update.
 | 
			
		||||
	Params Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParams) Reset()         { *m = MsgUpdateParams{} }
 | 
			
		||||
func (m *MsgUpdateParams) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*MsgUpdateParams) ProtoMessage()    {}
 | 
			
		||||
func (*MsgUpdateParams) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_e81067e0fbdaca18, []int{2}
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_MsgUpdateParams.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParams) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_MsgUpdateParams.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParams) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParams) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_MsgUpdateParams.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_MsgUpdateParams proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
// MsgUpdateParamsResponse defines the Msg/UpdateParams response type.
 | 
			
		||||
type MsgUpdateParamsResponse struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParamsResponse) Reset()         { *m = MsgUpdateParamsResponse{} }
 | 
			
		||||
func (m *MsgUpdateParamsResponse) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*MsgUpdateParamsResponse) ProtoMessage()    {}
 | 
			
		||||
func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_e81067e0fbdaca18, []int{3}
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParamsResponse) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_MsgUpdateParamsResponse.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParamsResponse) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_MsgUpdateParamsResponse.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParamsResponse) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_MsgUpdateParamsResponse.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*MsgFundCommunityPool)(nil), "kava.community.v1beta1.MsgFundCommunityPool")
 | 
			
		||||
	proto.RegisterType((*MsgFundCommunityPoolResponse)(nil), "kava.community.v1beta1.MsgFundCommunityPoolResponse")
 | 
			
		||||
	proto.RegisterType((*MsgUpdateParams)(nil), "kava.community.v1beta1.MsgUpdateParams")
 | 
			
		||||
	proto.RegisterType((*MsgUpdateParamsResponse)(nil), "kava.community.v1beta1.MsgUpdateParamsResponse")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("kava/community/v1beta1/tx.proto", fileDescriptor_e81067e0fbdaca18) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_e81067e0fbdaca18 = []byte{
 | 
			
		||||
	// 348 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcf, 0x4e, 0x2c, 0x4b,
 | 
			
		||||
	0xd4, 0x4f, 0xce, 0xcf, 0xcd, 0x2d, 0xcd, 0xcb, 0x2c, 0xa9, 0xd4, 0x2f, 0x33, 0x4c, 0x4a, 0x2d,
 | 
			
		||||
	0x49, 0x34, 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x03, 0x29, 0xd0,
 | 
			
		||||
	0x83, 0x2b, 0xd0, 0x83, 0x2a, 0x90, 0x92, 0x4b, 0xce, 0x2f, 0xce, 0xcd, 0x2f, 0xd6, 0x4f, 0x4a,
 | 
			
		||||
	0x2c, 0x4e, 0x85, 0xeb, 0x4a, 0xce, 0xcf, 0xcc, 0x83, 0xe8, 0x93, 0x92, 0x84, 0xc8, 0xc7, 0x83,
 | 
			
		||||
	0x79, 0xfa, 0x10, 0x0e, 0x54, 0x4a, 0x24, 0x3d, 0x3f, 0x3d, 0x1f, 0x22, 0x0e, 0x62, 0x41, 0x44,
 | 
			
		||||
	0x95, 0x76, 0x32, 0x72, 0x89, 0xf8, 0x16, 0xa7, 0xbb, 0x95, 0xe6, 0xa5, 0x38, 0xc3, 0x6c, 0x0b,
 | 
			
		||||
	0xc8, 0xcf, 0xcf, 0x11, 0x4a, 0xe6, 0x62, 0x4b, 0xcc, 0xcd, 0x2f, 0xcd, 0x2b, 0x91, 0x60, 0x54,
 | 
			
		||||
	0x60, 0xd6, 0xe0, 0x36, 0x92, 0xd4, 0x83, 0x9a, 0x06, 0xb2, 0x1a, 0xe6, 0x1e, 0x3d, 0xe7, 0xfc,
 | 
			
		||||
	0xcc, 0x3c, 0x27, 0x83, 0x13, 0xf7, 0xe4, 0x19, 0x56, 0xdd, 0x97, 0xd7, 0x48, 0xcf, 0x2c, 0xc9,
 | 
			
		||||
	0x28, 0x4d, 0x02, 0x39, 0x1b, 0x6a, 0x35, 0x94, 0xd2, 0x2d, 0x4e, 0xc9, 0xd6, 0x2f, 0xa9, 0x2c,
 | 
			
		||||
	0x48, 0x2d, 0x06, 0x6b, 0x28, 0x0e, 0x82, 0x1a, 0x2d, 0x64, 0xc6, 0xc5, 0x99, 0x92, 0x5a, 0x90,
 | 
			
		||||
	0x5f, 0x9c, 0x59, 0x92, 0x5f, 0x24, 0xc1, 0xa4, 0xc0, 0xa8, 0xc1, 0xe9, 0x24, 0x71, 0x69, 0x8b,
 | 
			
		||||
	0xae, 0x08, 0xd4, 0x2a, 0xc7, 0x94, 0x94, 0xa2, 0xd4, 0xe2, 0xe2, 0xe0, 0x92, 0xa2, 0xcc, 0xbc,
 | 
			
		||||
	0xf4, 0x20, 0x84, 0x52, 0x2b, 0x96, 0x8e, 0x05, 0xf2, 0x0c, 0x4a, 0x72, 0x5c, 0x32, 0xd8, 0x9c,
 | 
			
		||||
	0x1e, 0x94, 0x5a, 0x5c, 0x90, 0x9f, 0x57, 0x9c, 0x6a, 0x54, 0xc7, 0xc5, 0xec, 0x5b, 0x9c, 0x2e,
 | 
			
		||||
	0x54, 0xce, 0x25, 0x88, 0xe9, 0x3d, 0x1d, 0x3d, 0xec, 0x21, 0xac, 0x87, 0xcd, 0x44, 0x29, 0x13,
 | 
			
		||||
	0x52, 0x54, 0xc3, 0xec, 0x77, 0xf2, 0x5c, 0xf1, 0x48, 0x8e, 0xf1, 0xc4, 0x23, 0x39, 0xc6, 0x0b,
 | 
			
		||||
	0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86,
 | 
			
		||||
	0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0xb4, 0x91, 0x42, 0x0b, 0x64, 0xba, 0x6e, 0x4e, 0x62, 0x52, 0x31,
 | 
			
		||||
	0x98, 0xa5, 0x5f, 0x81, 0x94, 0x34, 0xc0, 0xc1, 0x96, 0xc4, 0x06, 0x8e, 0x2d, 0x63, 0x40, 0x00,
 | 
			
		||||
	0x00, 0x00, 0xff, 0xff, 0xc2, 0xe0, 0xfc, 0x03, 0x39, 0x02, 0x00, 0x00,
 | 
			
		||||
	// 446 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xcd, 0xaa, 0xd3, 0x40,
 | 
			
		||||
	0x14, 0xc7, 0x33, 0xde, 0x4b, 0xe1, 0xce, 0x15, 0xc4, 0x50, 0x34, 0x0d, 0x32, 0xb9, 0xd4, 0x85,
 | 
			
		||||
	0x05, 0x6d, 0xc6, 0x5b, 0xc5, 0x85, 0xb8, 0x31, 0x05, 0xc1, 0x45, 0xa1, 0x44, 0xdc, 0xb8, 0x91,
 | 
			
		||||
	0x49, 0x32, 0xa4, 0xa1, 0x4d, 0x4e, 0xc8, 0x4c, 0x6a, 0xfb, 0x06, 0x6e, 0x04, 0x1f, 0xc1, 0xa5,
 | 
			
		||||
	0xb8, 0x76, 0xe3, 0x1b, 0x74, 0x59, 0x5c, 0xb9, 0x52, 0x49, 0x37, 0x3e, 0x86, 0x24, 0x99, 0xd4,
 | 
			
		||||
	0xaa, 0xad, 0x1f, 0xab, 0xf9, 0xfa, 0x9f, 0xf3, 0xff, 0x9d, 0x33, 0x07, 0x5b, 0x53, 0x36, 0x67,
 | 
			
		||||
	0xd4, 0x87, 0x38, 0xce, 0x93, 0x48, 0x2e, 0xe9, 0xfc, 0xdc, 0xe3, 0x92, 0x9d, 0x53, 0xb9, 0xb0,
 | 
			
		||||
	0xd3, 0x0c, 0x24, 0xe8, 0x57, 0x4a, 0x81, 0xbd, 0x15, 0xd8, 0x4a, 0x60, 0x12, 0x1f, 0x44, 0x0c,
 | 
			
		||||
	0x82, 0x7a, 0x4c, 0xf0, 0x6d, 0x94, 0x0f, 0x51, 0x52, 0xc7, 0x99, 0x9d, 0xfa, 0xfd, 0x79, 0x75,
 | 
			
		||||
	0xa2, 0xf5, 0x41, 0x3d, 0xb5, 0x43, 0x08, 0xa1, 0xbe, 0x2f, 0x77, 0xea, 0xf6, 0xfa, 0x01, 0x92,
 | 
			
		||||
	0x94, 0x65, 0x2c, 0x56, 0xa1, 0xdd, 0x0f, 0x08, 0xb7, 0x47, 0x22, 0x7c, 0x94, 0x27, 0xc1, 0xb0,
 | 
			
		||||
	0x51, 0x8e, 0x01, 0x66, 0xba, 0x8f, 0x5b, 0x2c, 0x86, 0x3c, 0x91, 0x06, 0x3a, 0x3b, 0xea, 0x9d,
 | 
			
		||||
	0x0e, 0x3a, 0xb6, 0xb2, 0x2c, 0xf9, 0x1a, 0x68, 0x7b, 0x08, 0x51, 0xe2, 0xdc, 0x5e, 0x7d, 0xb6,
 | 
			
		||||
	0xb4, 0x77, 0x5f, 0xac, 0x5e, 0x18, 0xc9, 0x49, 0xee, 0x95, 0xb5, 0x29, 0x3e, 0xb5, 0xf4, 0x45,
 | 
			
		||||
	0x30, 0xa5, 0x72, 0x99, 0x72, 0x51, 0x05, 0x08, 0x57, 0xa5, 0xd6, 0xef, 0xe1, 0x93, 0x80, 0xa7,
 | 
			
		||||
	0x20, 0x22, 0x09, 0x99, 0x71, 0xe1, 0x0c, 0xf5, 0x4e, 0x1c, 0xe3, 0xe3, 0xfb, 0x7e, 0x5b, 0x59,
 | 
			
		||||
	0x3d, 0x0c, 0x82, 0x8c, 0x0b, 0xf1, 0x44, 0x66, 0x51, 0x12, 0xba, 0x3f, 0xa4, 0xf7, 0x8f, 0x5f,
 | 
			
		||||
	0xbe, 0xb1, 0xb4, 0x2e, 0xc1, 0xd7, 0xf6, 0xa1, 0xbb, 0x5c, 0xa4, 0x90, 0x08, 0xde, 0x7d, 0x85,
 | 
			
		||||
	0xf0, 0xa5, 0x91, 0x08, 0x9f, 0xa6, 0x01, 0x93, 0x7c, 0x5c, 0x55, 0x5d, 0x3a, 0xb2, 0x5c, 0x4e,
 | 
			
		||||
	0x20, 0x8b, 0xe4, 0xd2, 0x40, 0x7f, 0x73, 0xdc, 0x4a, 0xf5, 0x07, 0xb8, 0x55, 0xf7, 0xad, 0xc2,
 | 
			
		||||
	0x3c, 0x1d, 0x10, 0x7b, 0xff, 0x37, 0xda, 0xb5, 0x8f, 0x73, 0x5c, 0xf6, 0xc4, 0x55, 0x31, 0x8a,
 | 
			
		||||
	0xb7, 0x83, 0xaf, 0xfe, 0x82, 0xd3, 0xa0, 0x0e, 0xbe, 0x21, 0x7c, 0x34, 0x12, 0xa1, 0xfe, 0x02,
 | 
			
		||||
	0x5f, 0xfe, 0xfd, 0x2b, 0x6e, 0x1d, 0xf2, 0xda, 0x57, 0xbd, 0x79, 0xf7, 0x7f, 0xd4, 0x0d, 0x80,
 | 
			
		||||
	0x3e, 0xc1, 0x17, 0x7f, 0xea, 0xd3, 0x8d, 0x3f, 0x64, 0xd9, 0x15, 0x9a, 0xf4, 0x1f, 0x85, 0x8d,
 | 
			
		||||
	0x93, 0xf3, 0xf8, 0x6d, 0x41, 0xd0, 0xaa, 0x20, 0x68, 0x5d, 0x10, 0xf4, 0xb5, 0x20, 0xe8, 0xf5,
 | 
			
		||||
	0x86, 0x68, 0xeb, 0x0d, 0xd1, 0x3e, 0x6d, 0x88, 0xf6, 0xec, 0xe6, 0xce, 0x0c, 0x95, 0x89, 0xfb,
 | 
			
		||||
	0x33, 0xe6, 0x89, 0x6a, 0x47, 0x17, 0x3b, 0xb3, 0x5c, 0x0d, 0x93, 0xd7, 0xaa, 0x66, 0xf8, 0xce,
 | 
			
		||||
	0xf7, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x3a, 0x80, 0xec, 0x74, 0x03, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *MsgFundCommunityPool) Equal(that interface{}) bool {
 | 
			
		||||
@ -193,6 +279,54 @@ func (this *MsgFundCommunityPoolResponse) Equal(that interface{}) bool {
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
func (this *MsgUpdateParams) Equal(that interface{}) bool {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*MsgUpdateParams)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(MsgUpdateParams)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if this.Authority != that1.Authority {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !this.Params.Equal(&that1.Params) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
func (this *MsgUpdateParamsResponse) Equal(that interface{}) bool {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*MsgUpdateParamsResponse)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(MsgUpdateParamsResponse)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ context.Context
 | 
			
		||||
@ -208,6 +342,8 @@ const _ = grpc.SupportPackageIsVersion4
 | 
			
		||||
type MsgClient interface {
 | 
			
		||||
	// FundCommunityPool defines a method to allow an account to directly fund the community module account.
 | 
			
		||||
	FundCommunityPool(ctx context.Context, in *MsgFundCommunityPool, opts ...grpc.CallOption) (*MsgFundCommunityPoolResponse, error)
 | 
			
		||||
	// UpdateParams defines a method to allow an account to update the community module parameters.
 | 
			
		||||
	UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type msgClient struct {
 | 
			
		||||
@ -227,10 +363,21 @@ func (c *msgClient) FundCommunityPool(ctx context.Context, in *MsgFundCommunityP
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) {
 | 
			
		||||
	out := new(MsgUpdateParamsResponse)
 | 
			
		||||
	err := c.cc.Invoke(ctx, "/kava.community.v1beta1.Msg/UpdateParams", in, out, opts...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MsgServer is the server API for Msg service.
 | 
			
		||||
type MsgServer interface {
 | 
			
		||||
	// FundCommunityPool defines a method to allow an account to directly fund the community module account.
 | 
			
		||||
	FundCommunityPool(context.Context, *MsgFundCommunityPool) (*MsgFundCommunityPoolResponse, error)
 | 
			
		||||
	// UpdateParams defines a method to allow an account to update the community module parameters.
 | 
			
		||||
	UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnimplementedMsgServer can be embedded to have forward compatible implementations.
 | 
			
		||||
@ -240,6 +387,9 @@ type UnimplementedMsgServer struct {
 | 
			
		||||
func (*UnimplementedMsgServer) FundCommunityPool(ctx context.Context, req *MsgFundCommunityPool) (*MsgFundCommunityPoolResponse, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method FundCommunityPool not implemented")
 | 
			
		||||
}
 | 
			
		||||
func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterMsgServer(s grpc1.Server, srv MsgServer) {
 | 
			
		||||
	s.RegisterService(&_Msg_serviceDesc, srv)
 | 
			
		||||
@ -263,6 +413,24 @@ func _Msg_FundCommunityPool_Handler(srv interface{}, ctx context.Context, dec fu
 | 
			
		||||
	return interceptor(ctx, in, info, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
			
		||||
	in := new(MsgUpdateParams)
 | 
			
		||||
	if err := dec(in); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if interceptor == nil {
 | 
			
		||||
		return srv.(MsgServer).UpdateParams(ctx, in)
 | 
			
		||||
	}
 | 
			
		||||
	info := &grpc.UnaryServerInfo{
 | 
			
		||||
		Server:     srv,
 | 
			
		||||
		FullMethod: "/kava.community.v1beta1.Msg/UpdateParams",
 | 
			
		||||
	}
 | 
			
		||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
			
		||||
		return srv.(MsgServer).UpdateParams(ctx, req.(*MsgUpdateParams))
 | 
			
		||||
	}
 | 
			
		||||
	return interceptor(ctx, in, info, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _Msg_serviceDesc = grpc.ServiceDesc{
 | 
			
		||||
	ServiceName: "kava.community.v1beta1.Msg",
 | 
			
		||||
	HandlerType: (*MsgServer)(nil),
 | 
			
		||||
@ -271,6 +439,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{
 | 
			
		||||
			MethodName: "FundCommunityPool",
 | 
			
		||||
			Handler:    _Msg_FundCommunityPool_Handler,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			MethodName: "UpdateParams",
 | 
			
		||||
			Handler:    _Msg_UpdateParams_Handler,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	Streams:  []grpc.StreamDesc{},
 | 
			
		||||
	Metadata: "kava/community/v1beta1/tx.proto",
 | 
			
		||||
@ -343,6 +515,69 @@ func (m *MsgFundCommunityPoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, e
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParams) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	{
 | 
			
		||||
		size, err := m.Params.MarshalToSizedBuffer(dAtA[:i])
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
		i -= size
 | 
			
		||||
		i = encodeVarintTx(dAtA, i, uint64(size))
 | 
			
		||||
	}
 | 
			
		||||
	i--
 | 
			
		||||
	dAtA[i] = 0x12
 | 
			
		||||
	if len(m.Authority) > 0 {
 | 
			
		||||
		i -= len(m.Authority)
 | 
			
		||||
		copy(dAtA[i:], m.Authority)
 | 
			
		||||
		i = encodeVarintTx(dAtA, i, uint64(len(m.Authority)))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0xa
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParamsResponse) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParamsResponse) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encodeVarintTx(dAtA []byte, offset int, v uint64) int {
 | 
			
		||||
	offset -= sovTx(v)
 | 
			
		||||
	base := offset
 | 
			
		||||
@ -382,6 +617,30 @@ func (m *MsgFundCommunityPoolResponse) Size() (n int) {
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParams) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	l = len(m.Authority)
 | 
			
		||||
	if l > 0 {
 | 
			
		||||
		n += 1 + l + sovTx(uint64(l))
 | 
			
		||||
	}
 | 
			
		||||
	l = m.Params.Size()
 | 
			
		||||
	n += 1 + l + sovTx(uint64(l))
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MsgUpdateParamsResponse) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sovTx(x uint64) (n int) {
 | 
			
		||||
	return (math_bits.Len64(x|1) + 6) / 7
 | 
			
		||||
}
 | 
			
		||||
@ -554,6 +813,171 @@ func (m *MsgFundCommunityPoolResponse) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParams) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowTx
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: MsgUpdateParams: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: MsgUpdateParams: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var stringLen uint64
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowTx
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				stringLen |= uint64(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			intStringLen := int(stringLen)
 | 
			
		||||
			if intStringLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthTx
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + intStringLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthTx
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.Authority = string(dAtA[iNdEx:postIndex])
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 2:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var msglen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowTx
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				msglen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if msglen < 0 {
 | 
			
		||||
				return ErrInvalidLengthTx
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + msglen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthTx
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipTx(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthTx
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowTx
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: MsgUpdateParamsResponse: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: MsgUpdateParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipTx(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthTx
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func skipTx(dAtA []byte) (n int, err error) {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user