private static decimal CalculatePower(ApiStake stake, ApiFund fund, ApiStakeEvent eventItem) { var timeModifier = stake.TimeMultipliers .SingleOrDefault(tm => tm.RangeMin <= eventItem.Lock.Duration.Days && tm.RangeMax >= eventItem.Lock.Duration.Days) ?.Multiplier ?? 1m; var fundModifier = stake.FundMultipliers.ContainsKey(fund.Token.Symbol) ? stake.FundMultipliers[fund.Token.Symbol] : 1m; return(eventItem.Lock.Quantity * timeModifier * fundModifier * fund.Nav.PricePerToken); }
public static decimal CalculatePowerDifference(ApiStake stake, ApiFund fund, IReadOnlyList <ApiStakeEvent> events, ApiStakeEvent eventItem) { if (eventItem.Type == StakeEventType.Lockup) { return(CalculatePower(stake, fund, eventItem)); } else { var approximateQuantity = eventItem.Release.Quantity + (eventItem.Release.FeeQuantity ?? decimal.Zero); var items = events .Where(x => x.Type == StakeEventType.Lockup) .ToList(); var lockUp = items.Count > 0 ? items.Count == 1 ? items.Single() : items .OrderBy(x => x.ConfirmedAt) .FirstOrDefault(e => Math.Abs(e.Lock.Quantity - approximateQuantity) <= Precision) : throw new PermanentException($"No existing lockup data could be found for release event {eventItem.Hash}"); return(-CalculatePower(stake, fund, lockUp)); } }