Skip to content

Time-Weighted Rewards

Rewards in XPower are determined by three factors: level (stake depth), age (stake duration), and share distribution (market dynamics). Together they create a system that rewards genuine, sustained participation.

Reward Formula

For a single staked NFT, the reward R is:

R=(APR+APB)×age×D106×C

Where:

  • APR — Annual Percentage Rate (parts per million), based on NFT level
  • APB — Annual Percentage Bonus (parts per million), based on stake age
  • age — seconds elapsed since the NFT was staked
  • D — denomination (10), the XPOW value of the NFT
  • 106 — converts parts-per-million to a fraction (1,000,000 = 100%)
  • C — the CENTURY constant (36,525 days in seconds), the time denominator

APR — Level-Based Rate

The APR polynomial maps NFT level to a base reward rate:

APR()=eval3(,[add,div,mul,exp])

Where eval3 computes:

eval3(x,[a,d,m,e])=(x×md+a)e/256

Default APR Configuration

With default parameters [a=0, d=256, m=1, e=256], this simplifies to:

APR()=1=

Since APR is in parts per million (PPM), level 30 gives:

APR(30)=30 PPM=0.003%

Wait — this doesn't match the whitepaper's claim of 1.125% per level. The actual default implementation produces APR per level in PPM, and the rate calculation includes additional scaling. Refer to the APR calculation for the full derivation.

APB — Age-Based Bonus

The APB polynomial maps stake age to a vintage bonus:

APB(age)=eval3(ageInYears,[add,div,mul,exp])

Default: [a=0, d=256, m=25, e=256] gives approximately 0.1% per year of stake duration. This is additive with APR — a level-30 NFT staked for 5 years earns APR(30) + APB(5).

Age Tracking

Each APowerNft maintains an _age accumulator in the NftTreasury. Age represents time-weighted presence — an NFT staked for 1 year accumulates the same age regardless of when it was staked within that year.

Invariant: Average Duration Preservation

When partially unstaking, the remaining APowerNft retains an average staking duration equal to the pre-unstake average. This is mathematically guaranteed — a staker cannot "cherry-pick" newer or older portions of their position.

Transfer Handling

APowerNfts are transferable, but transfer triggers refreshClaimed() to update the total claimed reward counter. This prevents the new owner from re-claiming rewards already paid to the previous owner.

Dynamic Rate Adjustment

Beyond the base APR and APB, a scalar factor adjusts rates based on per-level share distribution:

  • Under-staked levels — receive a scalar > 1, boosting their effective rate
  • Over-staked levels — receive a scalar < 1, reducing their effective rate
  • Total reward pool — remains constant; the scalar only redistributes

This creates a market mechanism: stakers are incentivized to fill under-supplied levels, naturally balancing the distribution of staked capital across tiers.