| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import math
- from core.utils import *
- class Strategy(object):
- def __init__(self, epoch_len=0):
- self.epoch_len = epoch_len
- self.staked_tokens_ratio = [1]
- self.target_apy = TARGET_APR
- self.annual_return = [0]
- self.type = 'base'
- def set_ratio(self, slot, apr):
- return
- def staked_value(self, stake):
- return Num(self.staked_tokens_ratio[-1])*Num(stake)
- class Hodler(Strategy):
- def __init__(self, epoch_len):
- super().__init__(epoch_len)
- self.type = 'hodler'
- def set_ratio(self, slot, apr):
- if slot%self.epoch_len==0:
- self.staked_tokens_ratio += [1]
- self.annual_return +=[apr]
- class LinearStrategy(Strategy):
- def __init__(self, epoch_len=0):
- super().__init__(epoch_len)
- self.type = 'linear'
- def set_ratio(self, slot, apr):
- if slot%self.epoch_len==0:
- sr = Num(apr)/Num(self.target_apy)
- if sr>1:
- sr = 1
- elif sr<0:
- sr = 0
- self.staked_tokens_ratio += [sr]
- self.annual_return += [apr]
- class LogarithmicStrategy(Strategy):
- def __init__(self, epoch_len=0):
- super().__init__(epoch_len)
- self.type = 'logarithmic'
- def set_ratio(self, slot, apr):
- if slot%self.epoch_len==0:
- apr_ratio = math.fabs(apr/self.target_apy)
- fn = lambda x: (math.log(x, 10)+1)/2 * 0.95 + 0.05
- sr = Num(fn(apr_ratio) if apr_ratio != 0 else 0)
- if sr>1:
- sr = 1
- elif sr<0:
- sr = 0
- self.staked_tokens_ratio += [sr]
- self.annual_return += [apr]
- class SigmoidStrategy(Strategy):
- def __init__(self, epoch_len=0):
- super().__init__(epoch_len)
- self.type = 'sigmoid'
- def set_ratio(self, slot, apr):
- if slot%self.epoch_len==0:
- apr_ratio = apr/self.target_apy
- sr = Num(2/(1+math.pow(math.e, -4*apr_ratio))-1)
- if sr>1:
- sr = 1
- elif sr<0:
- sr = 0
- self.staked_tokens_ratio += [sr]
- self.annual_return += [apr]
- def random_strategy(epoch_length=EPOCH_LENGTH):
- rnd = random.random()
- if rnd < 0.25:
- return Hodler(epoch_length)
- elif rnd < 0.5 and rnd >= 0.25:
- return LinearStrategy(epoch_length)
- elif rnd < 0.75 and rnd >= 0.5:
- return LogarithmicStrategy(epoch_length)
- else:
- return SigmoidStrategy(epoch_length)
|