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
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
— denomination ( ), the XPOW value of the NFT — converts parts-per-million to a fraction (1,000,000 = 100%) — 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:
Where eval3 computes:
Default APR Configuration
With default parameters [a=0, d=256, m=1, e=256], this simplifies to:
Since APR is in parts per million (PPM), level 30 gives:
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:
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.