mint

package
v0.0.0-...-3786997 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 10, 2023 License: Apache-2.0 Imports: 19 Imported by: 0

README

Mint

The mint module is responsible for creating tokens in a flexible way to reward validators, incentivize providing pool liquidity, provide funds for Merlin governance, and pay developers to maintain and improve Merlin.

The module is also responsible for reducing the token creation and distribution by a set period until it reaches its maximum supply (see reduction_factor and reduction_period_in_epochs)

The module uses time basis epochs supported by the epochs module.

Contents

  1. Concept
  2. State
  3. Begin Epoch
  4. Parameters
  5. Events
  6. Queries

Concepts

The x/mint module is designed to handle the regular printing of new tokens within a chain. The design taken within Merlin is to

  • Mint new tokens once per epoch (default one week)
  • To have a "Reductioning factor" every period, which reduces the number of rewards per epoch. (default: period is 3 years, where a year is 52 epochs. The next period's rewards are 2/3 of the prior period's rewards)
Reduction factor

This is a generalization over the Bitcoin-style halvenings. Every year, the number of rewards issued per week will reduce by a governance-specified factor, instead of a fixed 1/2. So RewardsPerEpochNextPeriod = ReductionFactor * CurrentRewardsPerEpoch). When ReductionFactor = 1/2, the Bitcoin halvenings are recreated. We default to having a reduction factor of 2/3 and thus reduce rewards at the end of every year by 33%.

The implication of this is that the total supply is finite, according to the following formula:

Total Supply = InitialSupply + EpochsPerPeriod * { {InitialRewardsPerEpoch} / {1 - ReductionFactor} }

State

Minter

The Minter is an abstraction for holding current rewards information.

type Minter struct {
    EpochProvisions sdk.Dec   // Rewards for the current epoch
}
Params

Minting Params are held in the global params store.

LastReductionEpoch

Last reduction epoch stores the epoch number when the last reduction of coin mint amount per epoch has happened.

Begin-Epoch

Minting parameters are recalculated and inflation is paid at the beginning of each epoch. An epoch is signaled by x/epochs

NextEpochProvisions

The target epoch provision is recalculated on each reduction period (default 3 years). At the time of the reduction, the current provision is multiplied by the reduction factor (default 2/3), to calculate the provisions for the next epoch. Consequently, the rewards of the next period will be lowered by a 1 - reduction factor.

EpochProvision

Calculate the provisions generated for each epoch based on current epoch provisions. The provisions are then minted by the mint module's ModuleMinterAccount. These rewards are transferred to a FeeCollector, which handles distributing the rewards per the chain's needs. This fee collector is specified as the auth module's FeeCollector ModuleAccount.

Network Parameters

The minting module contains the following parameters:

Key Type Example
mint_denom string "umer"
genesis_epoch_provisions string (dec) "500000000"
epoch_identifier string "weekly"
reduction_period_in_epochs int64 156
reduction_factor string (dec) "0.6666666666666"
distribution_proportions.staking string (dec) "0.4"
distribution_proportions.pool_incentives string (dec) "0.3"
distribution_proportions.developer_rewards string (dec) "0.2"
distribution_proportions.community_pool string (dec) "0.1"
weighted_developer_rewards_receivers array [{"address": "merxx", "weight": "1"}]
minting_rewards_distribution_start_epoch int64 10

Below are all the network parameters for the mint module:

  • mint_denom - Token type being minted
  • genesis_epoch_provisions - Amount of tokens generated at the epoch to the distribution categories (see distribution_proportions)
  • epoch_identifier - Type of epoch that triggers token issuance (day, week, etc.)
  • reduction_period_in_epochs - How many epochs must occur before implementing the reduction factor
  • reduction_factor - What the total token issuance factor will reduce by after the reduction period passes (if set to 66.66%, token issuance will reduce by 1/3)
  • distribution_proportions - Categories in which the specified proportion of newly released tokens are distributed to
    • staking - Proportion of minted funds to incentivize staking MER
    • pool_incentives - Proportion of minted funds to incentivize pools on Merlin
    • developer_rewards - Proportion of minted funds to pay developers for their past and future work
    • community_pool - Proportion of minted funds to be set aside for the community pool
  • weighted_developer_rewards_receivers - Addresses that developer rewards will go to. The weight attached to an address is the percent of the developer rewards that the specific address will receive
  • minting_rewards_distribution_start_epoch - What epoch will start the rewards distribution to the aforementioned distribution categories
Notes
  1. mint_denom defines denom for minting token - umer
  2. genesis_epoch_provisions provides minting tokens per epoch at genesis.
  3. epoch_identifier defines the epoch identifier to be used for the mint module e.g. "weekly"
  4. reduction_period_in_epochs defines the number of epochs to pass to reduce the mint amount
  5. reduction_factor defines the reduction factor of tokens at every reduction_period_in_epochs
  6. distribution_proportions defines distribution rules for minted tokens, when the developer rewards address is empty, it distributes tokens to the community pool.
  7. weighted_developer_rewards_receivers provides the addresses that receive developer rewards by weight
  8. minting_rewards_distribution_start_epoch defines the start epoch of minting to make sure minting start after initial pools are set

Events

The minting module emits the following events:

End of Epoch
Type Attribute Key Attribute Value
mint epoch_number {epochNumber}
mint epoch_provisions {epochProvisions}
mint amount {amount}


Queries

params

Query all the current mint parameter values

query mint params

::: details Example

List all current min parameters in json format by:

merlind query mint params -o json | jq

An example of the output:

{
  "mint_denom": "umer",
  "genesis_epoch_provisions": "821917808219.178082191780821917",
  "epoch_identifier": "day",
  "reduction_period_in_epochs": "365",
  "reduction_factor": "0.666666666666666666",
  "distribution_proportions": {
    "staking": "0.250000000000000000",
    "pool_incentives": "0.450000000000000000",
    "developer_rewards": "0.250000000000000000",
    "community_pool": "0.050000000000000000"
  },
  "weighted_developer_rewards_receivers": [
    {
      "address": "mer14kjcwdwcqsujkdt8n5qwpd8x8ty2rys5rjrdjj",
      "weight": "0.288700000000000000"
    },
    {
      "address": "mer1gw445ta0aqn26suz2rg3tkqfpxnq2hs224d7gq",
      "weight": "0.229000000000000000"
    },
    {
      "address": "mer13lt0hzc6u3htsk7z5rs6vuurmgg4hh2ecgxqkf",
      "weight": "0.162500000000000000"
    },
    {
      "address": "mer1kvc3he93ygc0us3ycslwlv2gdqry4ta73vk9hu",
      "weight": "0.109000000000000000"
    },
    {
      "address": "mer19qgldlsk7hdv3ddtwwpvzff30pxqe9phq9evxf",
      "weight": "0.099500000000000000"
    },
    {
      "address": "mer19fs55cx4594een7qr8tglrjtt5h9jrxg458htd",
      "weight": "0.060000000000000000"
    },
    {
      "address": "mer1ssp6px3fs3kwreles3ft6c07mfvj89a544yj9k",
      "weight": "0.015000000000000000"
    },
    {
      "address": "mer1c5yu8498yzqte9cmfv5zcgtl07lhpjrj0skqdx",
      "weight": "0.010000000000000000"
    },
    {
      "address": "mer1yhj3r9t9vw7qgeg22cehfzj7enwgklw5k5v7lj",
      "weight": "0.007500000000000000"
    },
    {
      "address": "mer18nzmtyn5vy5y45dmcdnta8askldyvehx66lqgm",
      "weight": "0.007000000000000000"
    },
    {
      "address": "mer1z2x9z58cg96ujvhvu6ga07yv9edq2mvkxpgwmc",
      "weight": "0.005000000000000000"
    },
    {
      "address": "mer1tvf3373skua8e6480eyy38avv8mw3hnt8jcxg9",
      "weight": "0.002500000000000000"
    },
    {
      "address": "mer1zs0txy03pv5crj2rvty8wemd3zhrka2ne8u05n",
      "weight": "0.002500000000000000"
    },
    {
      "address": "mer1djgf9p53n7m5a55hcn6gg0cm5mue4r5g3fadee",
      "weight": "0.001000000000000000"
    },
    {
      "address": "mer1488zldkrn8xcjh3z40v2mexq7d088qkna8ceze",
      "weight": "0.000800000000000000"
    }
  ],
  "minting_rewards_distribution_start_epoch": "1"
}

:::

epoch-provisions

Query the current epoch provisions

query mint epoch-provisions

::: details Example

List the current epoch provisions:

merlind query mint epoch-provisions

As of this writing, this number will be equal to the genesis-epoch-provisions. Once the reduction_period_in_epochs is reached, the reduction_factor will be initiated and reduce the amount of MER minted per epoch. :::

Appendix

Current Configuration

mint module: Network Parameter effects and current configuration

The following tables show overall effects on different configurations of the mint related network parameters:

mint_denom epoch_provisions epoch_identifier
Type string string (dec) string
Higher N/A Higher inflation rate Increases time to reduction_period
Lower N/A Lower inflation rate Decreases time to reduction_period
Constraints N/A Value has to be a positive integer String must be day, week, month, or year
Current configuration umer 821917808219.178 (821,9178 MER) day
reduction_period_in_epochs reduction_factor staking
Type string string (dec) string (dec)
Higher Longer period of time until reduction_factor implemented Reduces time until maximum supply is reached More epoch provisions go to staking rewards than other categories
Lower Shorter period of time until reduction_factor implemented Increases time until maximum supply is reached Less epoch provisions go to staking rewards than other categories
Constraints Value has to be a whole number greater than or equal to 1 Value has to be less or equal to 1 Value has to be less or equal to 1 and all distribution categories combined must equal 1
Current configuration 365 (epochs) 0.666666666666666666 (66.66%) 0.250000000000000000 (25%)
pool_incentives developer_rewards community_pool
Type string (dec) string (dec) string (dec)
Higher More epoch provisions go to pool incentives than other categories More epoch provisions go to developer rewards than other categories More epoch provisions go to community pool than other categories
Lower Less epoch provisions go to pool incentives than other categories Less epoch provisions go to developer rewards than other categories Less epoch provisions go to community pool than other categories
Constraints Value has to be less or equal to 1 and all distribution categories combined must equal 1 Value has to be less or equal to 1 and all distribution categories combined must equal 1 Value has to be less or equal to 1 and all distribution categories combined must equal 1
Current configuration 0.450000000000000000 (45%) 0.250000000000000000 (25%) 0.050000000000000000 (5%)

Documentation

Overview

The `mint` module is responsible for creating tokens in a flexible way to reward validators, incentivize providing pool liquidity, provide funds for Merlin governance, and pay developers to maintain and improve Merlin.

  • Denom minting; reduction and reserve ratio settings
  • Token distribution proportions
  • Epoch start distribution settings

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AppModule

type AppModule struct {
	AppModuleBasic
	// contains filtered or unexported fields
}

AppModule implements an application module for the mint module.

func NewAppModule

func NewAppModule(cdc codec.Codec, keeper keeper.Keeper, ak types.AccountKeeper, bk types.BankKeeper) AppModule

NewAppModule creates a new AppModule object.

func (AppModule) BeginBlock

func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock)

BeginBlock returns the begin blocker for the mint module.

func (AppModule) ConsensusVersion

func (AppModule) ConsensusVersion() uint64

ConsensusVersion implements AppModule/ConsensusVersion.

func (AppModule) EndBlock

EndBlock returns the end blocker for the mint module. It returns no validator updates.

func (AppModule) ExportGenesis

func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage

ExportGenesis returns the exported genesis state as raw bytes for the mint module.

func (AppModule) GenerateGenesisState

func (AppModule) GenerateGenesisState(simState *module.SimulationState)

GenerateGenesisState creates a randomized GenState of the mint module.

func (AppModule) InitGenesis

func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate

InitGenesis performs genesis initialization for the mint module. It returns no validator updates.

func (AppModule) LegacyQuerierHandler

func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sdk.Querier

LegacyQuerierHandler returns the x/mint module's sdk.Querier.

func (AppModule) Name

func (AppModule) Name() string

Name returns the mint module's name.

func (AppModule) ProposalContents

func (AppModule) ProposalContents(simState module.SimulationState) []simtypes.WeightedProposalContent

ProposalContents doesn't return any content functions for governance proposals.

func (AppModule) QuerierRoute

func (AppModule) QuerierRoute() string

QuerierRoute returns the mint module's querier route name.

func (AppModule) RandomizedParams

func (AppModule) RandomizedParams(r *rand.Rand) []simtypes.ParamChange

RandomizedParams creates randomized mint param changes for the simulator.

func (AppModule) RegisterInvariants

func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry)

RegisterInvariants registers the mint module invariants.

func (AppModule) RegisterServices

func (am AppModule) RegisterServices(cfg module.Configurator)

RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries.

func (AppModule) RegisterStoreDecoder

func (am AppModule) RegisterStoreDecoder(sdr sdk.StoreDecoderRegistry)

RegisterStoreDecoder registers a decoder for mint module's types.

func (AppModule) Route

func (AppModule) Route() sdk.Route

Route returns the message routing key for the mint module.

func (AppModule) WeightedOperations

func (AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation

WeightedOperations doesn't return any mint module operation.

type AppModuleBasic

type AppModuleBasic struct {
	// contains filtered or unexported fields
}

AppModuleBasic defines the basic application module used by the mint module.

func (AppModuleBasic) DefaultGenesis

func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage

DefaultGenesis returns default genesis state as raw bytes for the mint module.

func (AppModuleBasic) GetQueryCmd

func (AppModuleBasic) GetQueryCmd() *cobra.Command

GetQueryCmd returns the root query command for the mint module.

func (AppModuleBasic) GetTxCmd

func (AppModuleBasic) GetTxCmd() *cobra.Command

GetTxCmd returns no root tx command for the mint module.

func (AppModuleBasic) Name

func (AppModuleBasic) Name() string

Name returns the mint module's name.

func (AppModuleBasic) RegisterGRPCGatewayRoutes

func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux)

RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the mint module.

func (AppModuleBasic) RegisterInterfaces

func (b AppModuleBasic) RegisterInterfaces(_ cdctypes.InterfaceRegistry)

RegisterInterfaces registers the module's interface types.

func (AppModuleBasic) RegisterLegacyAminoCodec

func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino)

RegisterLegacyAminoCodec registers the mint module's types on the given LegacyAmino codec.

func (AppModuleBasic) RegisterRESTRoutes

func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router)

RegisterRESTRoutes registers the REST routes for the mint module.

func (AppModuleBasic) ValidateGenesis

func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error

ValidateGenesis performs genesis state validation for the mint module.

Directories

Path Synopsis
client
cli
Package types is a reverse proxy.
Package types is a reverse proxy.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL