Select Git revision
-
George Miller authoredGeorge Miller authored
keeper.go 6.85 KiB
package keeper
import (
"github.com/tendermint/tendermint/libs/log"
"gitlab.com/oppy-finance/oppychain/x/mint/types"
poolincentivestypes "gitlab.com/oppy-finance/oppychain/x/pool_incentives/types"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
)
// Keeper of the mint store.
type Keeper struct {
cdc codec.BinaryCodec
storeKey sdk.StoreKey
paramSpace paramtypes.Subspace
accountKeeper types.AccountKeeper
bankKeeper types.BankKeeper
distrKeeper types.DistrKeeper
epochKeeper types.EpochKeeper
hooks types.MintHooks
feeCollectorName string
}
// NewKeeper creates a new mint Keeper instance.
func NewKeeper(
cdc codec.BinaryCodec, key sdk.StoreKey, paramSpace paramtypes.Subspace,
ak types.AccountKeeper, bk types.BankKeeper, dk types.DistrKeeper, epochKeeper types.EpochKeeper,
feeCollectorName string,
) Keeper {
// ensure mint module account is set
if addr := ak.GetModuleAddress(types.ModuleName); addr == nil {
panic("the mint module account has not been set")
}
// set KeyTable if it has not already been set
if !paramSpace.HasKeyTable() {
paramSpace = paramSpace.WithKeyTable(types.ParamKeyTable())
}
return Keeper{
cdc: cdc,
storeKey: key,
paramSpace: paramSpace,
accountKeeper: ak,
bankKeeper: bk,
distrKeeper: dk,
epochKeeper: epochKeeper,
feeCollectorName: feeCollectorName,
}
}
// SetInitialSupplyOffsetDuringMigration sets the supply offset based on the balance of the
// Develop rVesting Module Account. It should only be called one time during the initial
// migration to v7.
//func SetInitialSupplyOffsetDuringMigration(ctx sdk.Context, k Keeper) {
// moduleAccBalance := k.bankKeeper.GetBalance(ctx, k.accountKeeper.GetModuleAddress(types.DeveloperVestingModuleAcctName), k.GetParams(ctx).MintDenom)
// k.bankKeeper.AddSupplyOffset(ctx, moduleAccBalance.Denom, moduleAccBalance.Amount.Neg())
//}
// CreateDeveloperVestingModuleAccount creates the module account for developer vesting.
// Should only be called in initial genesis creation, never again.
func (k Keeper) CreateDeveloperVestingModuleAccount(ctx sdk.Context, amount sdk.Coin) {
moduleAcc := authtypes.NewEmptyModuleAccount(
types.DeveloperVestingModuleAcctName, authtypes.Minter)
k.accountKeeper.SetModuleAccount(ctx, moduleAcc)
err := k.bankKeeper.MintCoins(ctx, types.DeveloperVestingModuleAcctName, sdk.NewCoins(amount))
if err != nil {
panic(err)
}
}
// _____________________________________________________________________
// Logger returns a module-specific logger.
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
return ctx.Logger().With("module", "x/"+types.ModuleName)
}
// Set the mint hooks.
func (k *Keeper) SetHooks(h types.MintHooks) *Keeper {
if k.hooks != nil {
panic("cannot set mint hooks twice")
}
k.hooks = h
return k
}
// GetLastHalvenEpochNum returns last halven epoch number.
func (k Keeper) GetLastHalvenEpochNum(ctx sdk.Context) int64 {
store := ctx.KVStore(k.storeKey)
b := store.Get(types.LastHalvenEpochKey)
if b == nil {
return 0
}
return int64(sdk.BigEndianToUint64(b))
}
// SetLastHalvenEpochNum set last halven epoch number.
func (k Keeper) SetLastHalvenEpochNum(ctx sdk.Context, epochNum int64) {
store := ctx.KVStore(k.storeKey)
store.Set(types.LastHalvenEpochKey, sdk.Uint64ToBigEndian(uint64(epochNum)))
}
// get the minter.
func (k Keeper) GetMinter(ctx sdk.Context) (minter types.Minter) {
store := ctx.KVStore(k.storeKey)
b := store.Get(types.MinterKey)
if b == nil {
panic("stored minter should not have been nil")
}
k.cdc.MustUnmarshal(b, &minter)
return
}
// set the minter.
func (k Keeper) SetMinter(ctx sdk.Context, minter types.Minter) {
store := ctx.KVStore(k.storeKey)
b := k.cdc.MustMarshal(&minter)
store.Set(types.MinterKey, b)
}
// _____________________________________________________________________
// GetParams returns the total set of minting parameters.
func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) {
k.paramSpace.GetParamSet(ctx, ¶ms)
return params
}
// SetParams sets the total set of minting parameters.
func (k Keeper) SetParams(ctx sdk.Context, params types.Params) {
k.paramSpace.SetParamSet(ctx, ¶ms)
}
// _____________________________________________________________________
// MintCoins implements an alias call to the underlying supply keeper's
// MintCoins to be used in BeginBlocker.
func (k Keeper) MintCoins(ctx sdk.Context, newCoins sdk.Coins) error {
if newCoins.Empty() {
// skip as no coins need to be minted
return nil
}
return k.bankKeeper.MintCoins(ctx, types.ModuleName, newCoins)
}
// GetProportions gets the balance of the `MintedDenom` from minted coins and returns coins according to the `AllocationRatio`.
func (k Keeper) GetProportions(ctx sdk.Context, mintedCoin sdk.Coin, ratio sdk.Dec) sdk.Coin {
return sdk.NewCoin(mintedCoin.Denom, mintedCoin.Amount.ToDec().Mul(ratio).TruncateInt())
}
// DistributeMintedCoins implements distribution of minted coins from mint to external modules.
func (k Keeper) DistributeMintedCoin(ctx sdk.Context, mintedCoin sdk.Coin) error {
params := k.GetParams(ctx)
proportions := params.DistributionProportions
// allocate staking incentives into fee collector account to be moved to on next begin blocker by staking module
stakingIncentivesCoins := sdk.NewCoins(k.GetProportions(ctx, mintedCoin, proportions.Staking))
err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, k.feeCollectorName, stakingIncentivesCoins)
if err != nil {
return err
}
// allocate pool allocation ratio to incentives module account account
poolIncentivesCoins := sdk.NewCoins(k.GetProportions(ctx, mintedCoin, proportions.PoolIncentives))
err = k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.ModuleName, poolincentivestypes.ModuleName, poolIncentivesCoins)
if err != nil {
return err
}
devRewardCoin := k.GetProportions(ctx, mintedCoin, proportions.DeveloperRewards)
devRewardCoins := sdk.NewCoins(devRewardCoin)
// This is supposed to come from the developer vesting module address, not the mint module address
// we over-allocated to the mint module address earlier though, so we burn it right here.
err = k.bankKeeper.BurnCoins(ctx, types.ModuleName, devRewardCoins)
if err != nil {
return err
}
// subtract from original provision to ensure no coins left over after the allocations
communityPoolCoins := sdk.NewCoins(mintedCoin).Sub(stakingIncentivesCoins).Sub(poolIncentivesCoins).Sub(devRewardCoins)
err = k.distrKeeper.FundCommunityPool(ctx, communityPoolCoins, k.accountKeeper.GetModuleAddress(types.ModuleName))
if err != nil {
return err
}
// call an hook after the minting and distribution of new coins
k.hooks.AfterDistributeMintedCoin(ctx, mintedCoin)
return err
}