Note
x/dyncommCopy x/dyncomm is a Terra Classic-specific module that adjusts the minimum commission each validator must charge. It reacts to validator voting power and overall delegation concentration to discourage commission-free strategies that centralise stake under a few validators.
How it works
- Dynamic floor. Every epoch (end block), the module computes a recommended minimum commission based on the StrathCole formula using four parameters: MaxZeroCopy MaxZero, SlopeBaseCopy SlopeBase, SlopeVpImpactCopy SlopeVpImpact, and CapCopy Cap.
- Safety cap. Even after adjustments, the required commission cannot exceed CapCopy Cap (default 20%).
- Per-validator tracking. keeper.EndBlocker()Copy keeper.EndBlocker() scans the staking keeper for all validators and updates the minimum commission values stored in x/stakingCopy x/staking. Validators cannot set a commission below the computed floor.
- No direct transactions. The module has no MsgCopy Msg server. Parameter updates happen through governance parameter-change proposals targeting the dyncommCopy dyncomm subspace.
The calculation relies on validator voting power statistics gathered from staking, so it must run after staking updates within the end-block order configured in app/app.goCopy app/app.go.
Parameters (subspaceCopy subspace: dyncommCopy dyncomm)
| Name | Purpose | Default |
|---|---|---|
| MaxZeroCopy MaxZero | Voting-power share below which validators may charge 0% commission. | 0.5Copy 0.5 |
| SlopeBaseCopy SlopeBase | Baseline slope in the StrathCole formula. Controls how quickly minimum commission rises. | 2Copy 2 |
| SlopeVpImpactCopy SlopeVpImpact | Multiplier on voting-power impact. Higher values penalise large validators more. | 10Copy 10 |
| CapCopy Cap | Maximum enforced commission floor. | 0.2Copy 0.2 (20%) |
All parameters are decimal values in the SDK DecCopy Dec type. Governance proposals must keep them within validation bounds: MaxZeroCopy MaxZero and CapCopy Cap between 0 and 1, SlopeBase ≥ 0Copy SlopeBase ≥ 0, SlopeVpImpact > 0Copy SlopeVpImpact > 0.
Genesis and queries
- Genesis: types.DefaultGenesisState()Copy types.DefaultGenesisState() seeds the parameters above. There is no validator-specific state at genesis.
- Queries: Query/ParamsCopy Query/Params returns the current parameter set. Use terrad q dyncomm paramsCopy terrad q dyncomm params to inspect the configuration.
Operator guidance
- Validators should monitor the module to ensure their commission is never set below the enforced minimum; attempts to lower it will be rejected by staking if below the dynamic floor.
- Parameter adjustments should be coordinated with the staking community, as aggressive settings can increase minimum commission for smaller validators too.