x/valrewards awards validators using per-epoch points. Rewards are not share-based: each validator listed in the previous block’s commit info earns points in proportion to its voting power (whether or not it signed), proposers receive a fixed bonus, and epoch rewards are allocated proportionally to points. The module pays validators only; delegators receive no x/valrewards rewards.

Runtime model

  • current_reward_settings are used for the epoch currently accumulating points.
  • next_reward_settings are staged values that become active at the next epoch boundary.
  • Changes made during epoch N do not alter calculations already in progress for epoch N.
  • Whitelisted accounts can submit runtime setter messages.
  • Whitelist changes are governance-only through MsgUpdateParams.
  • PROPOSER_BONUS_POINTS remains hardcoded and is currently 1.
If rewarding_paused is switched to true during an epoch, the current epoch still completes and pays normally. The next epoch starts paused, records no new validator points, and creates no new outstanding reward rows.

Core logic

Mainnet values

On mainnet (c8ntinuum_8-1) the epoch length, reward per epoch, and whitelist differ from the default genesis below, and the rewards pool was funded at genesis: The whitelisted accounts can change blocks_in_epoch, rewards_per_epoch, and rewarding_paused without a governance proposal. Their changes are staged in next_reward_settings and take effect at the next epoch boundary. To see the current values, run ctmd query valrewards params and ctmd query valrewards rewards-pool.

Default genesis

These are the module defaults for a newly generated genesis, not the mainnet values.
The rewards pool balance is not duplicated inside app_state.valrewards; it remains part of the module account balance in auth/bank state.

Validation rules

Exposed methods

Cosmos SDK messages

  • MsgDepositRewardsPool(depositor, amount)
  • MsgClaimRewards(validator_operator, epoch, requester)
  • MsgSetBlocksInEpoch(signer, blocks_in_epoch)
  • MsgSetRewardsPerEpoch(signer, rewards_per_epoch)
  • MsgSetRewardingPaused(signer, rewarding_paused)
  • MsgUpdateParams(authority, params)
MsgClaimRewards is sponsor-callable: any valid requester may submit the transaction, but rewards are still paid only to the target validator account. Runtime setter messages require the signer to be present in params.whitelist; MsgUpdateParams is authority-only and intended for governance.

Queries

  • Query/RewardsPool
  • Query/ValidatorOutstandingRewards
  • Query/DelegationRewards
  • Query/Params
Query/ValidatorOutstandingRewards expects a canonical Bech32 validator operator address. Hex 0x... addresses are rejected. Query/DelegationRewards does not return delegator rewards. Its delegator field must be a validator operator’s account address (the c8... or 0x... account that owns the c8valoper... address). It returns that validator’s own outstanding reward for the epoch, the same value as Query/ValidatorOutstandingRewards, and fails with target address must be a validator operator for any other address.

EVM precompile

Address: 0x0000000000000000000000000000000000000714
  • rewardsPool()
  • validatorOutstandingRewards(epoch, validatorAddress)
  • delegationRewards(delegatorAddress, epoch) (delegatorAddress must be a validator operator’s account; see Query/DelegationRewards above)
  • depositValidatorRewardsPool(depositor, amount)
  • claimRewards(validatorOperatorAddress, epoch)
For exact ABI signatures, see Precompile ABI Reference.

CLI

claim and delegation-rewards take the validator operator’s account address (c8... or 0x...), for example the output of ctmd keys show <operator-key> -a, not the c8valoper... form. validator-outstanding-rewards takes the c8valoper... form.