Rewards Mechanism

Explanation of Moni.xyz rewards mechanism

Rounds

The primary mechanism of the staking system will consist of rounds, each round will have an established duration, initially 1 day.

Round finalization

The operator will call for ending the round and the following actions will take place at UTC midnight:

  1. Staked funds will be frozen

    • The round will not accept new stakers

    • The round will not accept withdraws

  2. Oracle call will get how many rewards were generated by the Compound staking mechanism and divide the number of tokens generated by the Staking Gates by this number.

The compound rewards generated by a real staking protocol will be represented by the following formula:

compoundRewards(a,b)=t=abrewardsPerSecond(t)compoundRewards(a, b) = \displaystyle\sum_{t=a}^brewardsPerSecond(t)

Given a round between a and b:

and the total points emitted by the existing content creators will be represented by:

emitted(a,b)=upointsEarned(u,a,b)emitted(a, b) = \displaystyle\sum_{u}pointsEarned(u, a, b)

The price per point emitted will be:

pricePerPoint(a,b)=compoundRewards(a,b)emitted(a,b)pricePerPoint(a, b) = \frac{compoundRewards(a,b)}{emitted(a,b)}
  1. The Oracle will persist the pricePerToken for the roundId

  2. A new round will be launched and this will freeze the current round's accumulated points and will allow the influencer to start accumulating new points for the new round

  3. New stakers and withdrawal will be resumed

  4. Influencers can withdraw past round's gains by requesting a completed round withdraw

  5. In order to generate a round withdrawal of earnings the contract will multiply the points earned by the pricePerPoint, so the total earning by the user u in the interval a, b will be:

totalEarnings(u,a,b)=emitted(u,a,b)×pricePerPoint(a,b)totalEarnings(u, a, b) = {emitted(u, a, b)}\times{pricePerPoint(a, b)}

After calculating earnings, the contract will mark the round roundId as paid for user u to prevent paying twice, then it will transfer the funds from the PayerContract.

Examples

For day 0:

Total staked = 100_000_000 USDC

Total points generated = 1000

Total interest earned by staking using a Compound protocol: 5479 USDC (2% APR)

Price per point: 5479 / 1000 = 5,47900

If only one influencer got staked in the total pool, the influencer will earn:

Total points generated * Price per point = Total interest earned by staking using Compound = 5479 USDC

If two influencers participated in the pool with 30/70, that’s:

Alice: 700 points earned

Bob: 300 points earned

Alice earnings will be 700*5,47900 = 3835,3 USDC

Bob earnings will be 300*5,47900= 1643,7 USDC

Notes

  • Between rounds, the tokens staked by users will pass from one round to another without the need for interaction. The only thing that will change is the points accumulated by content creators (it will be reset to 0) and the pricePerPoint that will be persisted.

  • Users can withdraw the balance only if the round is not paused, not finalizing and the threshold of time of the Gate is met.

  • An influencer can batch request withdrawal of rounds

    • This will create a request that will only iterate over rounds that are not paid and whose points balance is greater than zero.

  • Points are an abstraction that can be represented by real tokens

  • The emission of points per second is not relevant since the pricePerPoint is calculated and assigned for each round.

Last updated