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));
            }
        }