| id |
Title |
Status |
Author |
Description |
Discussions to |
Created |
| TIP-135 |
Staking contract changes |
Draft |
GorstakThales |
Changing how rewards for staking are distributed on Optimism |
discordlink |
2023-04-14 |
Simple Summary
This TIP proposes to change the ratio between BASE and GAMIFIED staking rewards
Abstract
Currently stakers on Optimism are weekly receiving 90k THALES, 60K is used for BASE rewards awarding all stakers, and 30k is used for GAMIFIED rewards awarding stakers who are active on Thales protocol.
This means that the ratio is 2:1 for BASE rewards, favoring idle stakers.
From those 30k allocated to GAMIFIED staking, 21k (70%) are allocated for Protocol Usage (Thales AMM trading, Vaults, Liquidity providing, Overtime trading) and 9k (30%) for SNX stakers.
To max out the protocol usage bucket a user needs to have at least 2 sUSD traded per 1 THALES received in last 4 weeks, which was very easy to do especially with introducing Vaults and LP.
Motivation
We want to motivate traders to trade as much as possible without having the goal to just reach the max rewards for gamified staking.
Specification
This TIP proposes to remove caps for maxing out rewards and volume will be calculated per week.
Additionally with this TIP we will introduce a new way of calculating GAMIFIED rewards.
GAMIFIED rewards will be distributed based on amount of Thales staked and volume generated per week.
SNX bucket is deprecated. Base and Bonus buckets stay as they are for the first iteration (on both Arbitrum and Optimism).
There are 3 ways of generating volume on Thales protocol:
- Trade via ThalesAMM/SportsAMM
- Deposit into Vaults
- Deposit into LP
Lets put this into a formula:
UserVolume = UserTotalVaultsDeposit x vaultsMultiplier + UserLPDeposit x LPMultiplier + TradingVolume x tradingMultiplier.
The values of multipliers are as follows:
vaultsMultiplier= 0.25
LPMultiplier= 0.5
tradingMultiplier= 1
We will introduce a new multiplier that will be calculated based on amount of Thales staked.
New ThalesMultiplier will have a minimal value of 1 and a maximum value of 5. (min and max value will be configurable variables).
ThalesMultiplier = 1 + 4 x UserThalesStaked / BiggestThalesStaker
We apply ThalesMultiplier to UserVolume to get final score for user:
TradingScore = ThalesMultiplier x UserVolume
Now we can distribute the rewards Pro rata based on TradingScore.
Variables
vaultsMultiplier= multiplier for round Vault deposits
LPMultiplier= multiplier for round Vault deposits
`tradingMultiplier= multiplier for all AMM trades
Test Cases
BASE rewards
Thales staking contract has 3 users:
- USER_1_STAKED = 100 Thales
- USER_2_STAKED = 200 Thales
- USER_3_STAKED = 300 Thales
Staking contract has a TOTAL_STAKED of 100 + 200 + 300 = 600Thales staked.
BASE_REWARDS per week are 45k Thales.
BASE rewards distribution for users:
- USER_1_BASE = BASE_REWARDS x USER_1_STAKED/TOTAL_STAKED = 45k x 100 / 600 = 7500 Thales
- USER_2_BASE = BASE_REWARDS x USER_2_STAKED/TOTAL_STAKED = 45k x 200 / 600 = 15000 Thales
- USER_3_BASE = BASE_REWARDS x USER_3_STAKED/TOTAL_STAKED = 45k x 300 / 600 = 22500 Thales
GAMIFIED rewards
TEST CASE 1 (Showcase multiplier)
- USER_1_STAKED = 500 Thales, USER_1_VOLUME = 1000
- USER_2_STAKED = 1000 Thales, USER_2_VOLUME = 1000
- USER_3_STAKED = 5000 Thales, USER_3_VOLUME = 1000
- USER_4_STAKED = 10000 Thales, USER_4_VOLUME = 1000
- USER_5_STAKED = 50000 Thales, USER_5_VOLUME = 1000
- USER_6_STAKED = 100000 Thales, USER_6_VOLUME = 1000
- USER_7_STAKED = 200000 Thales, USER_7_VOLUME = 1000
- USER_8_STAKED = 300000 Thales, USER_8_VOLUME = 1000
- USER_9_STAKED = 400000 Thales, USER_9_VOLUME = 1000
- USER_10_STAKED = 500000 Thales, USER_10_VOLUME = 1000
In this case USER_10_STAKED is the bigest staker with 500k Thales Staked.
Multiplier will be as follows:
- USER_1_MULTIPLIER = 1 + 4 x USER_1_STAKED/USER_10_STAKED = 1 + 4 x 500/500000 = 1.004
- USER_2_MULTIPLIER = 1 + 4 x USER_2_STAKED/USER_10_STAKED = 1 + 4 x 1000/500000 = 1.008
- USER_3_MULTIPLIER = 1 + 4 x 5000/500000 = 1.04
- USER_4_MULTIPLIER = 1 + 4 x 10000/500000 = 1.08
- USER_5_MULTIPLIER = 1 + 4 x 50000/500000 = 1.40
- USER_6_MULTIPLIER = 1 + 4 x 100000/500000 = 1.80
- USER_7_MULTIPLIER = 1 + 4 x 200000/500000 = 2.60
- USER_8_MULTIPLIER = 1 + 4 x 300000/500000 = 3.40
- USER_9_MULTIPLIER = 1 + 4 x 400000/500000 = 4.20
- USER_10_MULTIPLIER = 1 + 4 x 500000/500000 = 5
We can now calculate final TradingScore for users:
- USER_1_SCORE = USER_1_MULTIPLIER x USER_1_VOLUME = 1.004 x 1000 = 1004
- USER_2_SCORE = USER_2_MULTIPLIER x USER_2_VOLUME = 1.008 x 1000 = 1008
- USER_3_SCORE = USER_3_MULTIPLIER x USER_3_VOLUME = 1.04 x 1000 = 1040
- USER_4_SCORE = USER_4_MULTIPLIER x USER_4_VOLUME = 1.08 x 1000 = 1080
- USER_5_SCORE = USER_5_MULTIPLIER x USER_5_VOLUME = 1.40 x 1000 = 1400
- USER_6_SCORE = USER_6_MULTIPLIER x USER_6_VOLUME = 1.80 x 1000 = 1800
- USER_7_SCORE = USER_7_MULTIPLIER x USER_7_VOLUME = 2.60 x 1000 = 2600
- USER_8_SCORE = USER_8_MULTIPLIER x USER_8_VOLUME = 3.40 x 1000 = 3400
- USER_9_SCORE = USER_9_MULTIPLIER x USER_9_VOLUME = 4.20 x 1000 = 4200
- USER_10_SCORE = USER_10_MULTIPLIER x USER_10_VOLUME = 5 x 1000 = 5000
When we sum up all scores we get a total score of:
TOTAL_SCORE = 22532
Now we can calculate rewards for users:
GAMIFIED_REWARDS = 30k
- USER_1_REWARDS = USER_1_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1004 / 22532 x 30k = 1332.17 Thales
- USER_2_REWARDS = USER_2_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1008 / 22532 x 30k = 1336.66 Thales
- USER_3_REWARDS = USER_3_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1040 / 22532 x 30k = 1269.75 Thales
- USER_4_REWARDS = USER_4_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1080 / 22532 x 30k = 1204.54 Thales
- USER_5_REWARDS = USER_5_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1400 / 22532 x 30k = 1875.26 Thales
- USER_6_REWARDS = USER_6_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1800 / 22532 x 30k = 2409.08 Thales
- USER_7_REWARDS = USER_7_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 2600 / 22532 x 30k = 3471.89 Thales
- USER_8_REWARDS = USER_8_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 3400 / 22532 x 30k = 5085.79 Thales
- USER_9_REWARDS = USER_9_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 4200 / 22532 x 30k = 6311.75 Thales
- USER_10_REWARDS = USER_10_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 5000 / 22532 x 30k = 6663.25 Thales
TEST CASE 2 (Showcase volume )
- USER_1_STAKED = 500 Thales, USER_1_VOLUME = 100
- USER_2_STAKED = 1000 Thales, USER_2_VOLUME = 250
- USER_3_STAKED = 5000 Thales, USER_3_VOLUME = 500
- USER_4_STAKED = 10000 Thales, USER_4_VOLUME = 750
- USER_5_STAKED = 50000 Thales, USER_5_VOLUME = 1000
- USER_6_STAKED = 100000 Thales, USER_6_VOLUME = 1500
- USER_7_STAKED = 200000 Thales, USER_7_VOLUME = 2000
- USER_8_STAKED = 300000 Thales, USER_8_VOLUME = 5000
- USER_9_STAKED = 400000 Thales, USER_9_VOLUME = 10000
- USER_10_STAKED = 500000 Thales, USER_10_VOLUME = 20000
In this case USER_10_STAKED is the bigest staker with 500k Thales Staked.
Multiplier will be as follows:
- USER_1_MULTIPLIER = 1 + 4 x USER_1_STAKED/USER_10_STAKED = 1 + 4 x 500/500000 = 1.004
- USER_2_MULTIPLIER = 1 + 4 x USER_2_STAKED/USER_10_STAKED = 1 + 4 x 1000/500000 = 1.008
- USER_3_MULTIPLIER = 1 + 4 x 5000/500000 = 1.04
- USER_4_MULTIPLIER = 1 + 4 x 10000/500000 = 1.08
- USER_5_MULTIPLIER = 1 + 4 x 50000/500000 = 1.40
- USER_6_MULTIPLIER = 1 + 4 x 100000/500000 = 1.80
- USER_7_MULTIPLIER = 1 + 4 x 200000/500000 = 2.60
- USER_8_MULTIPLIER = 1 + 4 x 300000/500000 = 3.40
- USER_9_MULTIPLIER = 1 + 4 x 400000/500000 = 4.20
- USER_10_MULTIPLIER = 1 + 4 x 500000/500000 = 5
We can now calculate final TradingScore for users:
- USER_1_SCORE = USER_1_MULTIPLIER x USER_1_VOLUME = 1.004 x 100 = 100.4
- USER_2_SCORE = USER_2_MULTIPLIER x USER_2_VOLUME = 1.008 x 250 = 252
- USER_3_SCORE = USER_3_MULTIPLIER x USER_3_VOLUME = 1.04 x 500 = 520
- USER_4_SCORE = USER_4_MULTIPLIER x USER_4_VOLUME = 1.08 x 750 = 810
- USER_5_SCORE = USER_5_MULTIPLIER x USER_5_VOLUME = 1.40 x 1000 = 1400
- USER_6_SCORE = USER_6_MULTIPLIER x USER_6_VOLUME = 1.80 x 1500 = 2700
- USER_7_SCORE = USER_7_MULTIPLIER x USER_7_VOLUME = 2.60 x 2000 = 5200
- USER_8_SCORE = USER_8_MULTIPLIER x USER_8_VOLUME = 3.40 x 5000 = 17000
- USER_9_SCORE = USER_9_MULTIPLIER x USER_9_VOLUME = 4.20 x 10000 = 42000
- USER_10_SCORE = USER_10_MULTIPLIER x USER_10_VOLUME = 5 x 20000 = 100000
When we sum up all scores we get a total score of:
TOTAL_SCORE = 169986
Now we can calculate rewards for users:
GAMIFIED_REWARDS = 30k
- USER_1_REWARDS = USER_1_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 100.4 / 169986 x 30k = 17.66 Thales
- USER_2_REWARDS = USER_2_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 252 / 169986 x 30k = 44.41 Thales
- USER_3_REWARDS = USER_3_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 520 / 169986 x 30k = 91.61 Thales
- USER_4_REWARDS = USER_4_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 810 / 169986 x 30k = 142.77 Thales
- USER_5_REWARDS = USER_5_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1400 / 169986 x 30k = 232.62 Thales
- USER_6_REWARDS = USER_6_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 2700 / 169986 x 30k = 425.51 Thales
- USER_7_REWARDS = USER_7_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 5200 / 169986 x 30k = 820.41 Thales
- USER_8_REWARDS = USER_8_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 17000 / 169986 x 30k = 1691.97 Thales
- USER_9_REWARDS = USER_9_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 42000 / 169986 x 30k = 4213.69 Thales
- USER_10_REWARDS = USER_10_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 100000 / 169986 x 30k = 17614.94 Thales
TEST CASE 3 (Showcase volume )
- USER_1_STAKED = 500 Thales, USER_1_VOLUME = 20000
- USER_2_STAKED = 1000 Thales, USER_2_VOLUME = 10000
- USER_3_STAKED = 5000 Thales, USER_3_VOLUME = 5000
- USER_4_STAKED = 10000 Thales, USER_4_VOLUME = 2000
- USER_5_STAKED = 50000 Thales, USER_5_VOLUME = 1500
- USER_6_STAKED = 100000 Thales, USER_6_VOLUME = 1000
- USER_7_STAKED = 200000 Thales, USER_7_VOLUME = 750
- USER_8_STAKED = 300000 Thales, USER_8_VOLUME = 500
- USER_9_STAKED = 400000 Thales, USER_9_VOLUME = 250
- USER_10_STAKED = 500000 Thales, USER_10_VOLUME = 100
In this case USER_10_STAKED is the bigest staker with 500k Thales Staked.
Multiplier will be as follows:
- USER_1_MULTIPLIER = 1 + 4 x USER_1_STAKED/USER_10_STAKED = 1 + 4 x 500/500000 = 1.004
- USER_2_MULTIPLIER = 1 + 4 x USER_2_STAKED/USER_10_STAKED = 1 + 4 x 1000/500000 = 1.008
- USER_3_MULTIPLIER = 1 + 4 x 5000/500000 = 1.04
- USER_4_MULTIPLIER = 1 + 4 x 10000/500000 = 1.08
- USER_5_MULTIPLIER = 1 + 4 x 50000/500000 = 1.40
- USER_6_MULTIPLIER = 1 + 4 x 100000/500000 = 1.80
- USER_7_MULTIPLIER = 1 + 4 x 200000/500000 = 2.60
- USER_8_MULTIPLIER = 1 + 4 x 300000/500000 = 3.40
- USER_9_MULTIPLIER = 1 + 4 x 400000/500000 = 4.20
- USER_10_MULTIPLIER = 1 + 4 x 500000/500000 = 5
We can now calculate final TradingScore for users:
- USER_1_SCORE = USER_1_MULTIPLIER x USER_1_VOLUME = 1.004 x 20000 = 20080
- USER_2_SCORE = USER_2_MULTIPLIER x USER_2_VOLUME = 1.008 x 10000 = 10080
- USER_3_SCORE = USER_3_MULTIPLIER x USER_3_VOLUME = 1.04 x 5000 = 5200
- USER_4_SCORE = USER_4_MULTIPLIER x USER_4_VOLUME = 1.08 x 2000 = 2160
- USER_5_SCORE = USER_5_MULTIPLIER x USER_5_VOLUME = 1.40 x 1500 = 2100
- USER_6_SCORE = USER_6_MULTIPLIER x USER_6_VOLUME = 1.80 x 1000 = 1800
- USER_7_SCORE = USER_7_MULTIPLIER x USER_7_VOLUME = 2.60 x 750 = 1950
- USER_8_SCORE = USER_8_MULTIPLIER x USER_8_VOLUME = 3.40 x 500 = 1700
- USER_9_SCORE = USER_9_MULTIPLIER x USER_9_VOLUME = 4.20 x 250 = 1050
- USER_10_SCORE = USER_10_MULTIPLIER x USER_10_VOLUME = 5 x 100 = 500
When we sum up all scores we get a total score of:
TOTAL_SCORE = 46620
Now we can calculate rewards for users:
GAMIFIED_REWARDS = 30k
- USER_1_REWARDS = USER_1_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 20080 / 46620 x 30k = 12950.05 Thales
- USER_2_REWARDS = USER_2_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 10080 / 46620 x 30k = 6197.08 Thales
- USER_3_REWARDS = USER_3_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 5200 / 46620 x 30k = 3407.71 Thales
- USER_4_REWARDS = USER_4_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 2160 / 46620 x 30k = 1567.37 Thales
- USER_5_REWARDS = USER_5_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 2100 / 46620 x 30k = 1530.04 Thales
- USER_6_REWARDS = USER_6_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1800 / 46620 x 30k = 1305.03 Thales
- USER_7_REWARDS = USER_7_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1950 / 46620 x 30k = 1411.37 Thales
- USER_8_REWARDS = USER_8_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1700 / 46620 x 30k = 1230.02 Thales
- USER_9_REWARDS = USER_9_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1050 / 46620 x 30k = 720.43 Thales
- USER_10_REWARDS = USER_10_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 500 / 46620 x 30k = 256.05 Thales
Implementation
TBD
Copyright
Copyright and related rights waived via CC0.