func NewKeeper(
	cdc *codec.Codec, key sdk.StoreKey, paramSpace ParamSubspace,
	supplyKeeper SupplyKeeper, sk StakingKeeper, gk guardian.Keeper, pk sdk.ProtocolKeeper,
) Keeper {
	if addr := supplyKeeper.GetModuleAddress(types.ModuleName); addr == nil {
		panic(fmt.Sprintf("%s module account has not been set", types.ModuleName))
	}
	return Keeper{
		storeKey:     key,
		paramSpace:   paramSpace,
		supplyKeeper: supplyKeeper,
		sk:           sk,
		gk:           gk,
		cdc:          cdc,
		pk:           pk,
	}
}
NewKeeper returns a governance keeper. It handles:
- submitting governance proposals
- depositing funds into proposals, and activating upon sufficient funds being deposited
- users voting on proposals, with weight proportional to stake in the system
- and tallying the result of the vote.
NewKeeper returns a governance keeper. It handles:
- submitting governance proposals
- depositing funds into proposals, and activating upon sufficient funds being deposited
- users voting on proposals, with weight proportional to stake in the system
- and tallying the result of the vote.

CONTRACT: the parameter Subspace must have the param key table already initialized
package gov
import (
	"fmt"
	"time"
	"github.com/Dipper-Labs/Dipper-Protocol/app/v0/gov/types"
	"github.com/Dipper-Labs/Dipper-Protocol/app/v0/guardian"
	"github.com/Dipper-Labs/Dipper-Protocol/app/v0/supply/exported"
	"github.com/Dipper-Labs/Dipper-Protocol/codec"
	sdk "github.com/Dipper-Labs/Dipper-Protocol/types"
	"github.com/tendermint/tendermint/libs/log"
)
type Keeper struct {
	paramSpace ParamSubspace
	supplyKeeper SupplyKeeper
	sk StakingKeeper
	storeKey sdk.StoreKey
	cdc *codec.Codec
	router Router
	gk guardian.Keeper
	pk sdk.ProtocolKeeper
}