Skip to main content
Polygon PoS uses a validator share model for delegation. Delegators receive validator-specific ERC20 share tokens (referred to as VOL for a given validator) in exchange for staked POL, at a rate determined by the current exchange rate of the POL/VOL pair.
POL is the staking token. A delegator needs POL tokens to participate in delegation.

Technical specification

uint256 public validatorId; // Delegation contract for validator
uint256 public validatorRewards; // accumulated rewards for validator
uint256 public commissionRate; // validator's cut %
uint256 public validatorDelegatorRatio = 10; // to be implemented/used

uint256 public totalStake;
uint256 public rewards; // rewards for pool of delegation stake
uint256 public activeAmount; // # of tokens delegated which are part of active stake
Exchange rate formula:
ExchangeRate = (totalDelegatedPower + delegatorRewardPool) / totalDelegatorShares

Methods and variables

buyVoucher

function buyVoucher(uint256 _amount) public;
  • Transfers _amount to stakeManager and updates the timeline data structure for active stake.
  • updateValidatorState updates the timeline data structure.
  • Mints delegation shares using the current exchangeRate for _amount.
  • amountStaked tracks active stake per delegator for liquid reward calculations.

sellVoucher

function sellVoucher() public;
  • Uses current exchangeRate and share count to calculate total amount (active stake + rewards).
  • Unbonds active stake from validator and transfers rewards to delegator.
  • Removes active stake from timeline via updateValidatorState in stakeManager.
  • delegators mapping tracks stake in the withdrawal period.

withdrawRewards

function withdrawRewards() public;
  • Calculates rewards for a delegator and transfers them.
  • Burns shares proportional to the reward amount based on exchangeRate.
  • Example: delegator with 100 shares at exchange rate 200 receives 100 tokens reward; 50 shares are burned; delegator retains 50 shares worth 100 tokens.

reStake

function reStake() public;
Moves accumulated rewards into active stake without changing the share count (exchange rate is unchanged). Only the rewards are moved into active stake for both the validator share contract and stakeManager timeline. getLiquidRewards calculates accumulated rewards. Restaked amounts are counted as active stake and cannot be withdrawn immediately.

unStakeClaimTokens

function unStakeClaimTokens()
After the withdrawal period, delegators who sold their shares can claim their POL tokens. Transfers tokens to the user.

updateCommissionRate

function updateCommissionRate(uint256 newCommissionRate)
        external
        onlyValidator
Updates the commission percentage for the validator.

updateRewards

function updateRewards(uint256 reward, uint256 checkpointStakePower, uint256 validatorStake)
        external
        onlyOwner
        returns (uint256)
Called when a validator receives rewards for submitting a checkpoint. Distributes rewards between the validator and delegators.