mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-01-10 07:08:05 -05:00
[research/lotterysim] fix a bug with APR period during headstart phase
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user