iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

質押獎勵 (Stacking rewards)

如投入LP代幣可以獲得獎勵

其計算是假設總獎勵是1000,週期是10秒,所以每秒獎勵是100,第一秒A投入100,總量是100,所以第一秒可獲得是100%獎勵,是100,第二秒B投入100,總量是200,所以第二秒A可以獲得是50%獎勵,是50,以此類推。

設每秒獎勵R 投入代幣總量T 個人用戶投入量S 時間為起始k 結束n

求用戶獎勵=X

  1. 計算用戶獎勵量
    https://chart.googleapis.com/chart?cht=tx&chl=X%3D%20%5Csum_%7Bi%3Dk%7D%5E%7Bn-1%7D%20%7BSR%5Cover%20T%7D
    但這樣每秒需要計算每秒T的變化量

  2. 將T沒有變化的時間提出來,有變化就執行計算
    https://chart.googleapis.com/chart?cht=tx&chl=X%3DS%20%5Csum_%7Bi%3D0%7D%5E%7Bn-1%7D%20%7BR%5Cover%20T%7D%20-%20S%20%5Csum_%7Bi%3D0%7D%5E%7Bk-1%7D%20%7BR%5Cover%20T%7D
    把S提出用rn及rk表示不同T時的每秒可獲得獎勵累積,其不受用戶S影響(r=R/T)
    https://chart.googleapis.com/chart?cht=tx&chl=X%3DS(rn-rk)

  3. 將rn變化成rk
    https://chart.googleapis.com/chart?cht=tx&chl=r(n-k)%3D(n-k)%7BR%5Cover%20T%7D
    https://chart.googleapis.com/chart?cht=tx&chl=rn%20%3D%20rk%2B(n-k)%7BR%5Cover%20T%7D
    這樣我們只剩下rk是無法計算的,而rk在一開始沒有T時會是0,所以rk會從零開始累加,每次T變化就記錄下來T和時間n&k,逐步累加直到提出所有獎勵,就可以計算出X。

程式碼

更多程式碼可以參考youtube頻道:@smartcontractprogrammer

首先第一行 Calculate reward per token 對應

r += (R/totalSupply)*(current time - last updated time);

https://chart.googleapis.com/chart?cht=tx&chl=rn%20%3D%20rk%2B(n-k)%7BR%5Cover%20T%7D

第二行 Calculate reward earned by user 對應

rewards[user] += balanceOf[user]*(r-userRewardPerTokenPaid[user]);

https://chart.googleapis.com/chart?cht=tx&chl=X%3DS(rn-rk)

第三行 將舊的r(rk)更新為新的r(rn),更新加入mapping

userRewardPerTokenPaid[user] = r;

後面就是更新時間以及更新代幣量


上一篇
DEX & Defi ep.3
下一篇
DEX & Defi ep.5
系列文
Web3新手初探筆記32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言