darkie.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from utils import *
  2. from threading import Thread
  3. class Darkie(Thread):
  4. def __init__(self, airdrop, vesting=[], hp=False):
  5. Thread.__init__(self)
  6. self.vesting = [0] + vesting
  7. self.stake = (Num(airdrop) if hp else airdrop)
  8. self.finalized_stake = (Num(airdrop) if hp else airdrop) # after fork finalization
  9. self.Sigma = None
  10. self.feedback = None
  11. self.f = None
  12. self.won=False
  13. def clone(self):
  14. return Darkie(self.finalized_stake)
  15. def set_sigma_feedback(self, sigma, feedback, f, hp=False):
  16. self.Sigma = (Num(sigma) if hp else sigma)
  17. self.feedback = (Num(feedback) if hp else feedback)
  18. self.f = (Num(f) if hp else f)
  19. def run(self, hp=False):
  20. k=N_TERM
  21. def target(tune_parameter, stake):
  22. x = (Num(1) if hp else 1) - (Num(tune_parameter) if hp else tune_parameter)
  23. c = (x.ln() if type(x)==Num else math.log(x))
  24. sigmas = [ c/((self.Sigma+EPSILON)**i) * ( ((L_HP if hp else L)/fact(i)) ) for i in range(1, k+1) ]
  25. scaled_target = approx_target_in_zk(sigmas, stake) #+ (BASE_L_HP if hp else BASE_L)
  26. return scaled_target
  27. T = target(self.f, self.finalized_stake)
  28. self.won = lottery(T, hp)
  29. def update_vesting(self, slot):
  30. if slot >= len(self.vesting):
  31. return 0
  32. slot2vest_index = int(slot/28800.0)
  33. slot2vest_prev_index = int((slot-1)/28800.0)
  34. slot2vest_index_shifted = slot2vest_index - 1 # by end of month
  35. slot2vest_prev_index_shifted = slot2vest_prev_index - 1 # by end of month
  36. vesting_value = float(self.vesting[slot2vest_index_shifted]) - self.vesting[slot2vest_prev_index_shifted]
  37. self.stake+= vesting_value
  38. return vesting_value
  39. def update_stake(self):
  40. self.stake+=REWARD
  41. def finalize_stake(self):
  42. if self.won:
  43. self.finalized_stake = self.stake
  44. else:
  45. self.stake = self.finalized_stake