Mint
Contents
State
Minter
Params
Begin-Block
NextInflationRate
NextAnnualProvisions
BlockProvision
Parameters
Events
BeginBlocker
Client
CLI
gRPC
REST
Concepts
The Minting Mechanism
The minting mechanism was designed to:
allow for a flexible inflation rate determined by market demand targeting a particular bonded-stake ratio
effect a balance between market liquidity and staked supply
In order to best determine the appropriate market rate for inflation rewards, a moving change rate is used. The moving change rate mechanism ensures that if the % bonded is either over or under the goal %-bonded, the inflation rate will adjust to further incentivize or disincentivize being bonded, respectively. Setting the goal %-bonded at less than 100% encourages the network to maintain some non-staked tokens which should help provide some liquidity.
It can be broken down in the following way:
If the actual percentage of bonded tokens is below the goal %-bonded the inflation rate will increase until a maximum value is reached
If the goal % bonded (67% in Cosmos-Hub) is maintained, then the inflation rate will stay constant
If the actual percentage of bonded tokens is above the goal %-bonded the inflation rate will decrease until a minimum value is reached
State
Minter
The minter is a space for holding current inflation information.
Minter:
0x00 -> ProtocolBuffer(minter)
https://github.com/cosmos/cosmos-sdk/blob/v0.47.0-rc1/proto/cosmos/mint/v1beta1/mint.proto#L10-L24Params
The mint module stores its params in state with the prefix of 0x01, it can be updated with governance or the address with authority.
Params:
mint/params -> legacy_amino(params)
https://github.com/cosmos/cosmos-sdk/blob/v0.47.0-rc1/proto/cosmos/mint/v1beta1/mint.proto#L26-L59Begin-Block
Minting parameters are recalculated and inflation paid at the beginning of each block.
Inflation rate calculation
Inflation rate is calculated using an "inflation calculation function" that's passed to the NewAppModule function. If no function is passed, then the SDK's default inflation function will be used (NextInflationRate). In case a custom inflation calculation logic is needed, this can be achieved by defining and passing a function that matches InflationCalculationFn's signature.
type InflationCalculationFn func(ctx sdk.Context, minter Minter, params Params, bondedRatio math.LegacyDec) math.LegacyDecNextInflationRate
The target annual inflation rate is recalculated each block. The inflation is also subject to a rate change (positive or negative) depending on the distance from the desired ratio (67%). The maximum rate change possible is defined to be 13% per year, however, the annual inflation is capped as between 7% and 20%.
NextInflationRate(params Params, bondedRatio math.LegacyDec) (inflation math.LegacyDec) {
inflationRateChangePerYear = (1 - bondedRatio/params.GoalBonded) * params.InflationRateChange
inflationRateChange = inflationRateChangePerYear/blocksPerYr
// increase the new annual inflation for this next block
inflation += inflationRateChange
if inflation > params.InflationMax {
inflation = params.InflationMax
}
if inflation < params.InflationMin {
inflation = params.InflationMin
}
return inflation
}NextAnnualProvisions
Calculate the annual provisions based on current total supply and inflation rate. This parameter is calculated once per block.
NextAnnualProvisions(params Params, totalSupply math.LegacyDec) (provisions math.LegacyDec) {
return Inflation * totalSupplyBlockProvision
Calculate the provisions generated for each block based on current annual provisions. The provisions are then minted by the mint module's ModuleMinterAccount and then transferred to the auth's FeeCollector ModuleAccount.
BlockProvision(params Params) sdk.Coin {
provisionAmt = AnnualProvisions/ params.BlocksPerYear
return sdk.NewCoin(params.MintDenom, provisionAmt.Truncate())Parameters
The minting module contains the following parameters:
MintDenom
string
"uatom"
InflationRateChange
string (dec)
"0.130000000000000000"
InflationMax
string (dec)
"0.200000000000000000"
InflationMin
string (dec)
"0.070000000000000000"
GoalBonded
string (dec)
"0.670000000000000000"
BlocksPerYear
string (uint64)
"6311520"
Events
The minting module emits the following events:
BeginBlocker
mint
bonded_ratio
{bondedRatio}
mint
inflation
{inflation}
mint
annual_provisions
{annualProvisions}
mint
amount
{amount}
Client
CLI
A user can query and interact with the mint module using the CLI.
Query
The query commands allows users to query mint state.
simd query mint --helpannual-provisions
The annual-provisions command allows users to query the current minting annual provisions value
simd query mint annual-provisions [flags]Example:
simd query mint annual-provisionsExample Output:
22268504368893.612100895088410693inflation
The inflation command allows users to query the current minting inflation value
simd query mint inflation [flags]Example:
simd query mint inflationExample Output:
0.199200302563256955params
The params command allows users to query the current minting parameters
simd query mint params [flags]Example:
blocks_per_year: "4360000"
goal_bonded: "0.670000000000000000"
inflation_max: "0.200000000000000000"
inflation_min: "0.070000000000000000"
inflation_rate_change: "0.130000000000000000"
mint_denom: stakegRPC
A user can query the mint module using gRPC endpoints.
AnnualProvisions
The AnnualProvisions endpoint allows users to query the current minting annual provisions value
/cosmos.mint.v1beta1.Query/AnnualProvisionsExample:
grpcurl -plaintext localhost:9090 cosmos.mint.v1beta1.Query/AnnualProvisionsExample Output:
{
"annualProvisions": "1432452520532626265712995618"
}Inflation
The Inflation endpoint allows users to query the current minting inflation value
/cosmos.mint.v1beta1.Query/InflationExample:
grpcurl -plaintext localhost:9090 cosmos.mint.v1beta1.Query/InflationExample Output:
{
"inflation": "130197115720711261"
}Params
The Params endpoint allows users to query the current minting parameters
/cosmos.mint.v1beta1.Query/ParamsExample:
grpcurl -plaintext localhost:9090 cosmos.mint.v1beta1.Query/ParamsExample Output:
{
"params": {
"mintDenom": "stake",
"inflationRateChange": "130000000000000000",
"inflationMax": "200000000000000000",
"inflationMin": "70000000000000000",
"goalBonded": "670000000000000000",
"blocksPerYear": "6311520"
}
}REST
A user can query the mint module using REST endpoints.
annual-provisions
/cosmos/mint/v1beta1/annual_provisionsExample:
curl "localhost:1317/cosmos/mint/v1beta1/annual_provisions"Example Output:
{
"annualProvisions": "1432452520532626265712995618"
}inflation
/cosmos/mint/v1beta1/inflationExample:
curl "localhost:1317/cosmos/mint/v1beta1/inflation"Example Output:
{
"inflation": "130197115720711261"
}params
/cosmos/mint/v1beta1/paramsExample:
curl "localhost:1317/cosmos/mint/v1beta1/params"Example Output:
{
"params": {
"mintDenom": "stake",
"inflationRateChange": "130000000000000000",
"inflationMax": "200000000000000000",
"inflationMin": "70000000000000000",
"goalBonded": "670000000000000000",
"blocksPerYear": "6311520"
}
}