|
| 1 | +--- |
| 2 | +simd: 'XXXX' |
| 3 | +title: Rent-Adjusted Stake Delegations |
| 4 | +authors: |
| 5 | + - Jon C (Anza) |
| 6 | +category: Standard |
| 7 | +type: Core |
| 8 | +status: Review |
| 9 | +created: 2026-03-06 |
| 10 | +feature: (fill in with feature key and github tracking issues once accepted) |
| 11 | +--- |
| 12 | + |
| 13 | +## Summary |
| 14 | + |
| 15 | +A new calculation is proposed to adjust stake delegation amounts during the |
| 16 | +partitioned rewards payout system of |
| 17 | +[SIMD-118](https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0118-partitioned-epoch-reward-distribution.md), |
| 18 | +based on the Rent sysvar parameters at the beginning of that epoch. |
| 19 | + |
| 20 | +## Motivation |
| 21 | + |
| 22 | +If |
| 23 | +[SIMD-0438 (Rent Increase)](https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0438-rent-increase-safeguard.md) |
| 24 | +is enabled after any of the Rent decreases described in |
| 25 | +[SIMD-0437](https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0437-incremental-rent-reduction.md), |
| 26 | +a stake account created with lower Rent MAY have an inflated delegation amount, |
| 27 | +consisting of the delta between the previous (decreased) minimum balance and the |
| 28 | +new (increased) minimum balance. |
| 29 | + |
| 30 | +Although the potential divergence is on the order of 1/1000 of a SOL per stake |
| 31 | +account, an incorrect delegation amount gives validators an artificially higher |
| 32 | +stake weight, reflecting lamports that are not properly backed by real lamports |
| 33 | +in a stake account. |
| 34 | + |
| 35 | +## Detailed Design |
| 36 | + |
| 37 | +During the partitioned epoch rewards calculation outlined in |
| 38 | +[SIMD-118](https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0118-partitioned-epoch-reward-distribution.md), |
| 39 | +a stake's updated delegation MUST be calculated with the following formula: |
| 40 | + |
| 41 | +``` |
| 42 | +max(min(delegation + stake_rewards, lamports + stake_rewards - rent_exempt_reserve), 0) |
| 43 | +``` |
| 44 | + |
| 45 | +Where: |
| 46 | +* `delegation`: the account's pre-reward delegated lamport amount |
| 47 | +* `stake_rewards`: the account's calculated stake reward lamport amount for the |
| 48 | + past epoch |
| 49 | +* `lamports`: the account's pre-reward lamports |
| 50 | +* `rent_exempt_reserve`: the minimum lamport balance required for the stake |
| 51 | + account |
| 52 | + |
| 53 | +The distribution phase MUST set the `delegation.stake` field (offset `[156,164)`) |
| 54 | +in the stake account's data to the new delegation amount, expressed as a little- |
| 55 | +endian unsigned 64-bit integer. |
| 56 | + |
| 57 | +If the new delegation amount is 0, then `delegation.deactivation_epoch` (offset |
| 58 | +`[172,180)`) MUST be set to the rewarded epoch, expressed as a little-endian |
| 59 | +unsigned 64-bit integer. |
| 60 | + |
| 61 | +If the stake account does not have enough lamports to meet the minimum balance, |
| 62 | +no other change is required. The account will continue to exist as any other |
| 63 | +account that does not meet minimum balance requirements as described in |
| 64 | +[SIMD-0392](https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0392-relax-minimum-balance-check.md). |
| 65 | + |
| 66 | +The stake weight for the delegated vote account MUST take into account the new |
| 67 | +calculation. |
| 68 | + |
| 69 | +New entries in the Stake History sysvar MUST take into account the adjusted |
| 70 | +delegation amounts. |
| 71 | + |
| 72 | +During the implementation of block revenue distribution in |
| 73 | +[SIMD-0123](https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0123-block-revenue-distribution.md), |
| 74 | +block rewards MUST be used to cover the new required minimum balance, so |
| 75 | +the formula becomes: |
| 76 | + |
| 77 | +``` |
| 78 | +max(min(delegation + stake_rewards, lamports + stake_rewards + block_rewards - rent_exempt_reserve), 0) |
| 79 | +``` |
| 80 | + |
| 81 | +Where `block_rewards` represents the block rewards earned by the stake account |
| 82 | +in that epoch. All other variables are the same as before. |
| 83 | + |
| 84 | +## Alternatives Considered |
| 85 | + |
| 86 | +We could fix the minimum balance for stake accounts to the current minimum |
| 87 | +balance for 200 bytes. This approach breaks any existing on-chain programs or |
| 88 | +tooling that use the Rent sysvar to calculate the minimum balance of a stake |
| 89 | +account. |
| 90 | + |
| 91 | +We could explicitly tie this logic to |
| 92 | +[SIMD-0438](https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0438-rent-increase-safeguard.md) |
| 93 | +or any future proposal to increase rent. That approach would complicate a rent |
| 94 | +increase feature, and complicate any attempt for dynamic rent in the future. |
| 95 | +This proposal even works if Rent becomes dynamic, since delegation amounts will |
| 96 | +always be correct when new stake weights are calculated for the epoch. |
| 97 | + |
| 98 | +## Impact |
| 99 | + |
| 100 | +The biggest impact is that a delegation MAY decrease between epochs. Protocols |
| 101 | +MUST relax assumptions that delegation amounts only increase or stay the same. |
| 102 | + |
| 103 | +Protocols MUST allow for stake accounts to become inactive as a result of reward |
| 104 | +distribution, without an explicit call to `Deactivate` or `DeactivateDelinquent`. |
| 105 | + |
| 106 | +## Security Considerations |
| 107 | + |
| 108 | +Nothing to note in particular. |
| 109 | + |
| 110 | +In general, reward calculation and distribution is a complicated part of the |
| 111 | +protocol, and this change introduces more complexity to the calculation portion. |
0 commit comments