MIP-29 Staking V5, economics V2 part 1, new emission and buckets

Technical Implementation: Tail Inflation and New Reward Buckets

  1. Introduce Tail Inflation: Transition from an inflation model calculated against the initial genesis supply to a “tail inflation” model calculated against the current total supply. This new model includes an annual decay and a configurable floor, ensuring long-term network security and sustainability.
  2. Add New Reward Buckets: Introduce two new reward destinations, EcosystemGrowth and GrowthDividend, to diversify the distribution of epoch rewards alongside the existing ProtocolSustainability bucket.

2. Configuration Changes

To support the new logic, the economics configuration file at cmd/node/config/economics.toml has been updated with new parameters.
2.1 Tail Inflation Settings
A new section, [tailInflation], has been added to control the new inflation mechanism:

[tailInflation]
activationEpoch = 100
firstYearInflation = 0.08757 # 8.757%
decayPercentage = 0.0025 # 0.25%
minimumInflation = 0.02 # 2%

  • activationEpoch: The epoch at which the tail inflation logic becomes active. Before this epoch, the chain continues to use the original genesis-based inflation calculation.
  • maximumYearlyInflation: The upper ceiling for the annual inflation rate.
  • decayPercentage: The percentage by which the inflation rate is reduced at the start of each new “economics year” (a full cycle of epochs).
  • minimumInflation: The floor for the annual inflation rate. The decayed inflation rate will not fall below this value.

2.2 New Reward Bucket Settings
The [rewardsSettings] section has been expanded to include percentages and destination addresses for the two new reward buckets:
[rewardsSettings]
# … existing settings
ecosystemGrowthPercentage = 0.1
ecosystemGrowthAddress = “erd…”
growthDividendPercentage = 0.1
growthDividendAddress = “erd…”

  • ecosystemGrowthPercentage & ecosystemGrowthAddress: Defines the portion of the total epoch rewards allocated to the Ecosystem Growth fund and its destination address.
  • growthDividendPercentage & growthDividendAddress: Defines the portion of the total epoch rewards allocated to the Growth Dividend fund and its destination address.

3. Core Logic Implementation

The core logic resides in epochStart/metachain/economics.go and epochStart/metachain/rewards.go.

3.1 Inflation Calculation (economics.go)
The computeInflation function was modified to handle the transition to tail inflation.

  1. Activation Check: The function first checks if the current epoch is greater than or equal to the tailInflation.activationEpoch.
    • If not activated: The original logic, which calculates inflation based on the genesis supply, is executed.
    • If activated: The new tail inflation logic is triggered.
  2. Tail Inflation Logic:
    • The inflation rate is now calculated based on the currentTotalSupply, not the initial supply.
    • At the start of each new economics year, the inflation rate is decayed using the formula: currentInflation = previousInflation - decayPercentage
    • The resulting inflation rate is then constrained by the configured limits: it cannot fall below minimumInflation.
    • The final, adjusted inflation rate is used to calculate the TotalToDistribute rewards for the current epoch.

3.2 Reward Distribution (economics.go and rewards.go)

A key constraint of the implementation was to avoid making breaking changes to the core block.Economics struct, which is defined in an external dependency. This struct did not have fields for EcosystemGrowth and GrowthDividend. To work around this, the following approach was taken:

  1. Individual Reward Calculation (economics.go): The rewards for all three buckets (ProtocolSustainability, EcosystemGrowth, GrowthDividend) are calculated individually by multiplying the TotalToDistribute amount by their respective percentages from the configuration.
  2. Summing into a Single Field (economics.go): The three calculated reward amounts are summed together. This total sum is then assigned to the existing block.Economics.RewardsForProtocolSustainability field. From the perspective of the core block structure, it appears as one large reward for protocol sustainability.
  3. Exposing Individual Amounts (interface.go): To enable the creation of separate transactions, the EpochEconomicsDataProvider interface was extended. It now includes getter methods that return the individual, pre-summed reward amounts:
    • RewardsForProtocolSustainability()
    • RewardsForEcosystemGrowth()
    • RewardsForGrowthDividend()
  4. Creating Separate Transactions (rewards.go / rewardsV2.go):
    • The rewardsCreator structs were updated to use the enhanced EpochEconomicsDataProvider.
    • In the CreateRewardsMiniBlocks function, the creator now calls the new getters to retrieve the individual reward amounts for each of the three buckets.
    • It then creates three distinct rewardTx.RewardTx transactions, each with the correct value and destination address as specified in economics.toml.
    • These three transactions are then added to the rewards miniblocks to be processed by the network, ensuring each fund receives its correct allocation.
3 Likes

It would be great to shorten the 10-day unbonding period and enable instant delegator switches.

2 Likes