private CalculateFeeCoefficientsOfType GetTxFeeInitialCoefficient()
        {
            var totalParameter  = new CalculateFeeCoefficientsOfType();
            var txFeeParameter1 = new CalculateFeeCoefficient
            {
                FeeType        = FeeTypeEnum.Tx,
                FunctionType   = CalculateFunctionTypeEnum.Liner,
                PieceKey       = 1000000,
                CoefficientDic = { { "numerator", 1 }, { "denominator", 800 }, { "constantValue".ToLower(), 10000 } }
            };
            var txFeeParameter2 = new CalculateFeeCoefficient
            {
                FeeType        = FeeTypeEnum.Tx,
                FunctionType   = CalculateFunctionTypeEnum.Power,
                PieceKey       = int.MaxValue,
                CoefficientDic =
                {
                    { "numerator",            1 }, { "denominator", 800 }, { "power", 2 }, { "changeSpanBase".ToLower(), 100 }, { "weight", 1 },
                    { "weightBase".ToLower(), 1 }
                }
            };

            totalParameter.Coefficients.Add(txFeeParameter1);
            totalParameter.Coefficients.Add(txFeeParameter2);
            return(totalParameter);
        }
        private bool UpdatePowerAlgorithm(CoefficientFromSender sender, CalculateFeeCoefficient dbData)
        {
            var coefficient = sender.PowerCoefficient;

            if (coefficient.Denominator <= 0)
            {
                return(false);
            }
            if (coefficient.Numerator < 0)
            {
                return(false);
            }
            if (coefficient.Weight <= 0)
            {
                return(false);
            }
            if (coefficient.WeightBase <= 0)
            {
                return(false);
            }
            if (coefficient.ChangeSpanBase <= 0)
            {
                return(false);
            }
            dbData.CoefficientDic[nameof(coefficient.Denominator).ToLower()]    = coefficient.Denominator;
            dbData.CoefficientDic[nameof(coefficient.Numerator).ToLower()]      = coefficient.Numerator;
            dbData.CoefficientDic[nameof(coefficient.Weight).ToLower()]         = coefficient.Weight;
            dbData.CoefficientDic[nameof(coefficient.WeightBase).ToLower()]     = coefficient.WeightBase;
            dbData.CoefficientDic[nameof(coefficient.ChangeSpanBase).ToLower()] = coefficient.ChangeSpanBase;
            return(true);
        }
Example #3
0
        public async Task Net_Token_Fee_Calculate_After_Update_Piecewise_Function_Test()
        {
            await InitializeCoefficientAsync();

            var calculateNetCostStrategy = Application.ServiceProvider.GetRequiredService <ICalculateTrafficCostStrategy>();
            var ps = await GetCoefficientByType(FeeTypeEnum.Traffic);

            var apiParam = new CalculateFeeCoefficient
            {
                FeeType        = FeeTypeEnum.Traffic,
                FunctionType   = CalculateFunctionTypeEnum.Liner,
                PieceKey       = 1000000,
                CoefficientDic = { { "numerator", 1 }, { "denominator", 400 } }
            };
            var           blockIndex   = new BlockIndex();
            IChainContext chainContext = new ChainContext
            {
                BlockHash   = blockIndex.BlockHash,
                BlockHeight = blockIndex.BlockHeight
            };
            var theOne = ps.Coefficients.SingleOrDefault(x => x.PieceKey == 1000000);

            ps.Coefficients.Remove(theOne);
            ps.Coefficients.Add(apiParam);
            await HandleTestAsync(ps, blockIndex);

            var size       = 10000;
            var updatedFee = await calculateNetCostStrategy.GetCostAsync(chainContext, size);

            updatedFee.ShouldBe(25_0000_0000);
        }
        private bool ChangeFeePieceKey(CoefficientFromSender coefficient, CalculateFeeCoefficient dbData)
        {
            var newPieceKey = coefficient.NewPieceKeyCoefficient.NewPieceKey;

            if (newPieceKey == coefficient.PieceKey || newPieceKey <= 0)
            {
                return(false);
            }
            dbData.PieceKey = newPieceKey;
            return(true);
        }
        private bool IsModifiedDbData(CoefficientFromSender coefficientInput, CalculateFeeCoefficient funcCoefficient)
        {
            bool isChanged;

            if (coefficientInput.IsChangePieceKey)
            {
                isChanged = ChangeFeePieceKey(coefficientInput, funcCoefficient);
            }
            else if (coefficientInput.IsLiner)
            {
                isChanged = UpdateLinerAlgorithm(coefficientInput, funcCoefficient);
            }
            else
            {
                isChanged = UpdatePowerAlgorithm(coefficientInput, funcCoefficient);
            }

            return(isChanged);
        }
        private bool UpdateLinerAlgorithm(CoefficientFromSender sender, CalculateFeeCoefficient dbData)
        {
            var coefficient = sender.LinerCoefficient;

            if (coefficient.Denominator <= 0)
            {
                return(false);
            }
            if (coefficient.Numerator < 0)
            {
                return(false);
            }
            if (coefficient.ConstantValue < 0)
            {
                return(false);
            }
            dbData.CoefficientDic[nameof(coefficient.Denominator).ToLower()]   = coefficient.Denominator;
            dbData.CoefficientDic[nameof(coefficient.Numerator).ToLower()]     = coefficient.Numerator;
            dbData.CoefficientDic[nameof(coefficient.ConstantValue).ToLower()] = coefficient.ConstantValue;
            return(true);
        }