How are Sui staking rewards calculated and paid?
October 31, 2026
At the end of every epoch, the protocol pools that epoch's computation gas fees and the stake subsidy. It splits them among active validators in proportion to voting power. Each validator keeps its commission (0–20%), and the rest goes into its staking pool, which raises the pool's SUI-per-pool-token exchange rate. Stakers aren't sent rewards. Their StakedSui is simply worth more when they withdraw, and rewards compound automatically.
The calculation, step by step
This is what advance_epoch in the sui_system framework does at each epoch change:
- Collect the reward pot. Total reward = computation fees for the epoch + the stake subsidy for the epoch.
- Carve out the storage fund's share. The storage fund takes a share of computation fees equal to its share of (storage fund + total stake). 5% of that is reinvested in the fund (
storage_fund_reinvest_rate = 500bps). The remainder is split equally among validators and isn't shared with stakers. - Split the rest by voting power. Each validator gets
reward × voting_power / 10,000. - Apply reports. If a quorum of validators reported a validator during the epoch, it loses 100% of its staking rewards for that epoch (
reward_slashing_rate = 10000bps). The forfeited amount goes to the other validators. - Take commission. The validator keeps
reward × commission_rate. Its commission plus its storage-fund share are staked back into its own pool as a newStakedSui. - Pay the pool. The remaining reward is deposited into the staking pool. A new exchange rate is recorded for the next epoch.
How your share is worked out
Your stake is tracked as pool tokens, bought at the exchange rate of your activation epoch. When you withdraw in epoch E', the framework uses the rate recorded at the start of E':
SUI returned = principal × rate(E') / rate(activation epoch)So you earn for every full epoch your stake was active. You don't earn for the epoch in which you stake, because stake activates next epoch. You don't earn for the epoch in which you withdraw, because that epoch's rewards haven't been distributed yet.
The stake subsidy
The subsidy comes from a fixed allocation held in the system state, not from new issuance. It pays a set amount each epoch, and that amount falls by 10% every 90 epochs. As of epoch 1291 (25 October 2026), the on-chain values were:
current_distribution_amount: about 254,187 SUI per epochstake_subsidy_period_length: 90 epochsstake_subsidy_decrease_rate: 1000 bps (10%)- Remaining subsidy balance: about 226 million SUI
When the subsidy runs out, rewards come only from fees. Read the current values with:
curl -s https://graphql.mainnet.sui.io/graphql \
-H 'content-type: application/json' \
-d '{"query":"{ epoch { epochId systemState { json } } }"}' \
| jq '.data.epoch.systemState.json.stake_subsidy'What actually changes your yield
- Total stake. The same reward pot spread over more stake means less per SUI.
- Network activity. More transactions mean more computation fees.
- Commission. A validator with 5% commission passes on more than one with 20%.
- Validator behaviour. A validator that gets reported loses that epoch's rewards for all its stakers.
Which validator you pick doesn't change the per-SUI reward much, apart from commission and reports. Rewards are split by voting power, and voting power is proportional to stake, except for validators at the 10% voting-power cap. Don't trust APY figures without checking how they were computed. You can derive the real figure from a pool's exchange rates across epochs.
Related: how staking works, how to unstake, and Sui tokenomics.
Sources
- Validator rewards, Sui documentation
- sui_system_state_inner.move, sui-system framework
- validator_set.move, sui-system framework
- stake_subsidy.move, sui-system framework
- sui-protocol-config, MystenLabs/sui