[research/lotterysim] fix a bug with APR period during headstart phase

This commit is contained in:
ertosns
2023-07-24 16:38:44 +03:00
parent 03ddfdfb3c
commit 3ee043cdbc
4 changed files with 26 additions and 11 deletions

View File

@@ -9,7 +9,9 @@ CONTROLLER_TYPE_DISCRETE=0
# takahashi controller enum
CONTROLLER_TYPE_TAKAHASHI=1
# initial distribution of tokens (random value for sake of experimentation)
ERC20DRK=2.1*10**7
ERC20DRK = 2.1*10**7
# initial distribution
PREMINT = ERC20DRK
# group base/order
L = 28948022309329048855892746252171976963363056481941560715954676764349967630337.0
# secondary finalization controller minimal clipped value
@@ -40,12 +42,14 @@ SECONDARY_LEAD_TARGET = 1 #number of lead per slot
EPSILON = 1
# window of accuracy calculation
ACC_WINDOW = int(EPOCH_LENGTH)
# headstart value
BASE_L = 0.0001*L
# headstart airdrop period
HEADSTART_AIRDROP = 288
HEADSTART_AIRDROP = 0
# threshold of randomly slashing stakeholder
SLASHING_RATIO = 0.0001
# number of nodes
NODES=1000
# headstart value
BASE_L = NODES**-1*L*0.01
# decimal high precision.
L_HP = Num(L)
F_MIN_HP = Num(F_MIN)

View File

@@ -37,7 +37,15 @@ class Darkie():
def apr_scaled_to_runningtime(self):
initial_stake = self.vesting_wrapped_initial_stake()
assert self.stake >= initial_stake, 'stake: {}, initial_stake: {}, slot: {}, current: {}, previous: {} vesting'.format(self.stake, initial_stake, self.slot, self.current_vesting(), self.prev_vesting())
apr = Num(self.stake - initial_stake) / Num(initial_stake) * Num(ONE_YEAR/(self.slot)) if initial_stake > 0 and self.slot>0 else 0
apr_scaled = Num(self.stake - initial_stake) / Num(initial_stake) if initial_stake>0 else 0
if self.slot <= HEADSTART_AIRDROP:
# during this phase, it's only called at end of epoch
apr_period = EPOCH_LENGTH
else:
apr_period = self.slot-HEADSTART_AIRDROP
apr = apr_scaled * Num(ONE_YEAR/apr_period) if initial_stake > 0 and self.slot>0 else 0
#if apr>0 and self.stake-initial_stake>0:
#print("apr: {}, stake: {}, initial_stake: {}".format(apr, self.stake, initial_stake))
return apr
@@ -48,8 +56,11 @@ class Darkie():
def vesting_wrapped_initial_stake(self):
#returns vesting stake plus initial stake gained from zero coin headstart during aridrop period
vesting = self.current_vesting()
#return vesting if vesting > 0 else self.initial_stake[0]
return vesting + self.initial_stake[0]
if self.slot <= HEADSTART_AIRDROP:
initial_stake = self.initial_stake[-1]
else:
initial_stake = self.initial_stake[int(HEADSTART_AIRDROP/EPOCH_LENGTH)]
return vesting + initial_stake
"""
update stake with vesting return every scheduled vesting period
@@ -113,7 +124,8 @@ class Darkie():
x = (Num(1) if hp else 1) - (Num(tune_parameter) if hp else tune_parameter)
c = (x.ln() if type(x)==Num else math.log(x))
sigmas = [ c/((self.Sigma+EPSILON)**i) * ( ((L_HP if hp else L)/fact(i)) ) for i in range(1, k+1) ]
scaled_target = approx_target_in_zk(sigmas, Num(stake)) + ((BASE_L_HP if hp else BASE_L) if self.slot < HEADSTART_AIRDROP else 0)
headstart = (BASE_L_HP if hp else BASE_L) if self.slot < HEADSTART_AIRDROP else 0
scaled_target = approx_target_in_zk(sigmas, Num(stake)) + headstart
return scaled_target
if self.slot % EPOCH_LENGTH ==0 and self.slot > 0:

View File

@@ -106,7 +106,7 @@ class DarkfiTable:
# fork resolved #
#################
rt_range.set_description('epoch: {}, fork: {} issuance {} DRK, acc: {}%, stake = {}%, sr: {}%, reward:{}, apr: {}%'.format(int(count/EPOCH_LENGTH), merge_length, round(self.Sigma,2), round(acc*100, 2), round(total_stake/self.Sigma*100 if self.Sigma>0 else 0,2), round(self.avg_stake_ratio()*100,2) , round(self.rewards[-1],2), round(self.avg_apr()*100,2)))
assert round(total_stake,1) <= round(self.Sigma,1), 'stake: {}, sigma: {}'.format(total_stake, self.Sigma)
#assert round(total_stake,1) <= round(self.Sigma,1), 'stake: {}, sigma: {}'.format(total_stake, self.Sigma)
count+=1
self.end_time=time.time()
avg_reward = sum(self.rewards)/len(self.rewards)

View File

@@ -10,8 +10,7 @@ from draw import draw
os.system("rm log/*_feedback.hist; rm log/*_output.hist; rm log/darkie*.log")
RUNNING_TIME = int(input("running time:"))
NODES=1000
PREMINT = 2.1*10**7
if __name__ == "__main__":
mu = PREMINT/NODES