IPOR Protocol
Comment on page

Math behind the rewards contract

LR - Block number when the last rebalancing took place. Certain variables would be rebalanced when the state change is necessary. Those events would include:
  • adding or modifying staked tokens balance by the user
  • changing parameters used to calculate boost, such as rewards per block
ULR - Time of rebalancing that occurrs when the user modifies his position (ipToken, pwToken delegation). It is saved under individual staking position.

User power-up

User power-up is calculated for each user whose position changes. That includes staking or unstaking ipTokens or modifying the delegated balance of pwIPOR.
The user's power-up is governed by the below function:
UPU={10(pwIporipToken)+0.2pwIporipToken<0.014(pwIporipToken)+0.26pwIporipToken<0.023(pwIporipToken)+0.28pwIporipToken<0.032(pwIporipToken)+0.31pwIporipToken<0.041(pwIporipToken)+0.35pwIporipToken<0.05VS+log2(HS+pwIporipToken)pwIporipToken0.05UPU = \begin{cases} 10\cdot \left(\frac{pwIpor}{ipToken} \right) +0.2 & \frac{pwIpor}{ipToken} < 0.01 \\ 4\cdot \left(\frac{pwIpor}{ipToken} \right) +0.26 & \frac{pwIpor}{ipToken} < 0.02 \\ 3\cdot \left(\frac{pwIpor}{ipToken} \right) +0.28 & \frac{pwIpor}{ipToken} < 0.03 \\ 2\cdot \left(\frac{pwIpor}{ipToken} \right) +0.31 & \frac{pwIpor}{ipToken} < 0.04 \\ 1\cdot \left(\frac{pwIpor}{ipToken} \right) +0.35 & \frac{pwIpor}{ipToken} < 0.05 \\ VS + \log_2\left(HS +\frac{pwIpor}{ipToken}\right) & \frac{pwIpor}{ipToken} \ge 0.05 \\ \end{cases}
VS - Vertical Shift HS - Horizontal Shift pwIpor - User's pwIPOR balance delegated to a particular asset ipToken - User's staked ipToken balance
The curve can be swapped by the DAO for a different one at a later stage in time, affecting all future rebalancings. The user's power-up value is fixed and can only be changed if the rebalancing is triggered.

Aggregate Power-up

Aggregate Power-up is a synthetic summary of all power-ups across all users. It's used to calculate individual rewards in relation to the rest of the pool.
APU=#all users whitch stake ipTokens1(ipTokensUPU)APU = \sum_{\# \text{all users whitch stake }ipTokens \geq 1} (ipTokens \cdot UPU)
APU - Aggregate Power-up UPU - User Power-up

Accrued rewards

Accrued rewards are tracked over time to allow for the calculation of users' rewards between events of rebalancing.
accruedRewards=accruedRewardsLR+rewardsPerBlock  (blockNumberblockNumberLR)\operatorname{accruedRewards} = \operatorname{accruedRewards}_{LR} + \operatorname{rewardsPerBlock} ~\cdot~ \left(\text{blockNumber} - \operatorname{blockNumber}_{LR}\right)

Composite Multiplier

CM=blockRewardsAPUCM = \frac{blockRewards}{APU}
The composite multiplier (CM) accounts for the rewards per "boosted unit of liquidity staked" per block.
CMC=#blocksCMBlockCMC = \sum_{\# blocks}CM_{Block}
Composite Multiplier Cummulative (CMC) is a sum of Composite multipliers for every block until now.

Account Mining Rewards

User rewards at block n can be calculated using the below formula. Block ULR is the block with the state of compositeMultiplierCumulative (CMC) at the time of the last rebalancing of user rewards.
userRewardsn=ipTokenUPU  (CMCn-1​−CMCULR1)userRewards_{n}​=ipToken * UPU~*~\left(\operatorname{CMC}_{\operatorname{n-1}}​−CMC_{ULR-1}​\right)
is saved when the user modifies his position. It is calculated to reflect the state without accounting for the current block.
CMCULR1=CMCLR1+(URLLR)CMLRCMC_{ULR-1} = CMC_{LR-1} + \left(URL-LR \right) \cdot CM_{LR}
When the user modifies their position, the most recent CMC is saved per the user's record.

Basic assumptions

VerticalShift ⇒ VS ⇒
104 10^{-4}
HorizontalShift ⇒ HS ⇒ 1
ipToken ⇒ 1
pwIpor ⇒ 0
$totalRewards = 25