Skip to content

Latest commit

 

History

History
147 lines (103 loc) · 7.03 KB

TIP-135.md

File metadata and controls

147 lines (103 loc) · 7.03 KB
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 how the bonus rewards are allocated in gamified staking

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 + UserThalesStaked / StakingDivider

StakingDivider is a configurable variable that will be set to 100,000. Thus, if someone stakes 100k THALES, his multipler is 2 (1+1). If someone stakes 700k THALES, his multipier is 5 (as its the maximum multiplier).

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= 0.25x, multiplier for round Vault deposits
LPMultiplier= 0.5x, multiplier for round Vault deposits
tradingMultiplier= 1x, multiplier for all AMM trades
StakingDivider= 100k, used for getting the staked multiplier

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

Multiplier will be as follows:

  • USER_1_MULTIPLIER = 1 + USER_1_STAKED/100000 = 1 + 500/100000 = 1.005
  • USER_2_MULTIPLIER = 1 + USER_2_STAKED/100000 = 1 + 1000/100000 = 1.01
  • USER_3_MULTIPLIER = 1 + 5000/100000 = 1.05
  • USER_4_MULTIPLIER = 1 + 10000/100000 = 1.10
  • USER_5_MULTIPLIER = 1 + 50000/100000 = 1.50
  • USER_6_MULTIPLIER = 1 + 100000/100000 = 2.00
  • USER_7_MULTIPLIER = 1 + 200000/100000 = 3.00
  • USER_8_MULTIPLIER = 1 + 300000/100000 = 4.00
  • USER_9_MULTIPLIER = 1 + 400000/100000 = 5.00
  • USER_10_MULTIPLIER = 1 + 500000/100000 = 5 (max set)

We can now calculate final TradingScore for users:

  • USER_1_SCORE = USER_1_MULTIPLIER x USER_1_VOLUME = 1.005 x 1000 = 1005
  • USER_2_SCORE = USER_2_MULTIPLIER x USER_2_VOLUME = 1.01 x 1000 = 1010
  • USER_3_SCORE = USER_3_MULTIPLIER x USER_3_VOLUME = 1.05 x 1000 = 1050
  • USER_4_SCORE = USER_4_MULTIPLIER x USER_4_VOLUME = 1.10 x 1000 = 1100
  • USER_5_SCORE = USER_5_MULTIPLIER x USER_5_VOLUME = 1.50 x 1000 = 1500
  • USER_6_SCORE = USER_6_MULTIPLIER x USER_6_VOLUME = 2.00 x 1000 = 2000
  • USER_7_SCORE = USER_7_MULTIPLIER x USER_7_VOLUME = 3.00 x 1000 = 3000
  • USER_8_SCORE = USER_8_MULTIPLIER x USER_8_VOLUME = 4.00 x 1000 = 4000
  • USER_9_SCORE = USER_9_MULTIPLIER x USER_9_VOLUME = 5.00 x 1000 = 5000
  • USER_10_SCORE = USER_10_MULTIPLIER x USER_10_VOLUME = 5.00 x 1000 = 5000

When we sum up all scores we get a total score of:

TOTAL_SCORE = 24665

Now we can calculate rewards for users:

GAMIFIED_REWARDS = 30k

  • USER_1_REWARDS = USER_1_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1005 / 24665 x 30000 = 1222.38 Thales
  • USER_2_REWARDS = USER_2_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1010 / 24665 x 30000 = 1228.46 Thales
  • USER_3_REWARDS = USER_3_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1050 / 24665 x 30000 = 1277.11 Thales
  • USER_4_REWARDS = USER_4_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1100 / 24665 x 30000 = 1337.93 Thales
  • USER_5_REWARDS = USER_5_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 1500 / 24665 x 30000 = 1824.45 Thales
  • USER_6_REWARDS = USER_6_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 2000 / 24665 x 30000 = 2432.60 Thales
  • USER_7_REWARDS = USER_7_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 3000 / 24665 x 30000 = 3648.90 Thales
  • USER_8_REWARDS = USER_8_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 4000 / 24665 x 30000 = 4865.20 Thales
  • USER_9_REWARDS = USER_9_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 5000 / 24665 x 30000 = 6081.50 Thales
  • USER_10_REWARDS = USER_10_SCORE/TOTAL_SCORE x GAMIFIED_REWARDS = 5000 / 24665 x 30000 = 6081.50 Thales

Implementation

link

Copyright

Copyright and related rights waived via CC0.