From dd8fd7c38386292511cf1d14ca6486afa8b2b9d5 Mon Sep 17 00:00:00 2001 From: ivfrol12 Date: Sun, 20 Oct 2019 03:20:10 +0300 Subject: [PATCH 1/5] Fee service --- dto/apiRequests.go | 2 + services/feeCalculator/feeCalculator.go | 154 ++++++++++++++++++------ services/server/handlers/fee.go | 41 +++++-- 3 files changed, 152 insertions(+), 45 deletions(-) diff --git a/dto/apiRequests.go b/dto/apiRequests.go index d43543c..75528b4 100644 --- a/dto/apiRequests.go +++ b/dto/apiRequests.go @@ -8,9 +8,11 @@ type SharedApiReq struct { type GetFeeRequest struct { *SharedApiReq ReceiversCount int `json:"receiversCount"` + Speed string `json:"speed,omitempty"` } type GetTokenFeeRequest struct { *SharedApiReq TokenAddress string `json:"tokenAddress"` + Speed string `json:"speed,omitempty"` } diff --git a/services/feeCalculator/feeCalculator.go b/services/feeCalculator/feeCalculator.go index 74f591b..e2e1160 100644 --- a/services/feeCalculator/feeCalculator.go +++ b/services/feeCalculator/feeCalculator.go @@ -14,7 +14,15 @@ type feeCalculator struct { FeePerByte int } -func GetBitcoinFee(address string, amount string, receiversCount int) (dto.GetFeeResponse, responses.ResponseError, error) { +type Params struct { + Address string + Amount string + ReceiversCount int + Speed string + TokenAddress string +} + +func GetBitcoinFee(params *Params) (dto.GetFeeResponse, responses.ResponseError, error) { var utxos responses.UtxoResponse var apiUtxoErr, apiFeeErr responses.ResponseError @@ -25,7 +33,7 @@ func GetBitcoinFee(address string, amount string, receiversCount int) (dto.GetFe wg.Add(2) go func() { defer wg.Done() - utxos, apiUtxoErr = api.GetUtxo(address, "btc") + utxos, apiUtxoErr = api.GetUtxo(params.Address, "btc") }() go func() { @@ -39,12 +47,22 @@ func GetBitcoinFee(address string, amount string, receiversCount int) (dto.GetFe } else if apiUtxoErr.Error != nil || apiUtxoErr.ApiError != nil { return dto.GetFeeResponse{}, apiUtxoErr, nil } - - fee, apiErr := calcUtxoFee(utxos.Utxo, amount, receiversCount, feeCalculator{ - CalcFee: calcBitcoinFee, - MinFeePerByte: 10, - FeePerByte: feePerByte.HalfHourFee, - }) + + f, _ := speedControl(feePerByte, params.Speed) + // todo : complete + f.MinFeePerByte = 10 + + // Test + //switch params.Speed { + //case "1": + // f.FeePerByte = feePerByte.HourFee + //case "1.5": + // f.FeePerByte = feePerByte.HalfHourFee + //case "2": + // f.FeePerByte = feePerByte.FastestFee + //} + + fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, *f) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetFeeResponse{}, apiErr, nil } @@ -52,7 +70,7 @@ func GetBitcoinFee(address string, amount string, receiversCount int) (dto.GetFe return fee, responses.ResponseError{}, nil } -func GetLitecoinFee(address string, amount string, receiversCount int) (dto.GetFeeResponse, responses.ResponseError, error) { +func GetLitecoinFee(params *Params) (dto.GetFeeResponse, responses.ResponseError, error) { var utxos responses.UtxoResponse var apiUtxoErr, apiFeeErr responses.ResponseError @@ -63,7 +81,7 @@ func GetLitecoinFee(address string, amount string, receiversCount int) (dto.GetF wg.Add(2) go func() { defer wg.Done() - utxos, apiUtxoErr = api.GetUtxo(address, "ltc") + utxos, apiUtxoErr = api.GetUtxo(params.Address, "ltc") }() go func() { @@ -78,23 +96,23 @@ func GetLitecoinFee(address string, amount string, receiversCount int) (dto.GetF return dto.GetFeeResponse{}, apiUtxoErr, nil } - fee, apiErr := calcUtxoFee(utxos.Utxo, amount, receiversCount, feeCalculator{ - CalcFee: calcLitecoinFee, - MinFeePerByte: 8, - FeePerByte: feePerByte.MediumFeePerKb / 1024, - }) + f, _ := speedControl(feePerByte, params.Speed) + // todo : complete + f.MinFeePerByte = 8 + + fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, *f) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetFeeResponse{}, apiErr, nil } return fee, responses.ResponseError{}, nil } -func GetBitcoinCashFee(address string, amount string, receiversCount int) (dto.GetFeeResponse, responses.ResponseError, error) { - utxos, apiErr := api.GetUtxo(address, "bch") +func GetBitcoinCashFee(params *Params) (dto.GetFeeResponse, responses.ResponseError, error) { + utxos, apiErr := api.GetUtxo(params.Address, "bch") if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetFeeResponse{}, apiErr, nil } - fee, apiErr := calcUtxoFee(utxos.Utxo, amount, receiversCount, feeCalculator{ + fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, feeCalculator{ CalcFee: calcBitcoinCashFee, MinFeePerByte: 1, FeePerByte: 3, @@ -105,7 +123,7 @@ func GetBitcoinCashFee(address string, amount string, receiversCount int) (dto.G return fee, responses.ResponseError{}, nil } -func GetEthereumFee(address string, amount string) (dto.GetEthFeeResponse, responses.ResponseError, error) { +func GetEthereumFee(params *Params) (dto.GetEthFeeResponse, responses.ResponseError, error) { var fee responses.EthereumFeeResponse var feeErr, balanceErr responses.ResponseError @@ -121,7 +139,7 @@ func GetEthereumFee(address string, amount string) (dto.GetEthFeeResponse, respo go func() { defer wg.Done() - balance, balanceErr = api.GetEthereumBalance(address) + balance, balanceErr = api.GetEthereumBalance(params.Address) }() wg.Wait() @@ -131,14 +149,16 @@ func GetEthereumFee(address string, amount string) (dto.GetEthFeeResponse, respo return dto.GetEthFeeResponse{}, balanceErr, nil } - fr, err := CalculateEthBasedFee(balance.Balance, fee.GasPrice, 21000, amount) + _, gaz := speedControl(fee, params.Speed) + + fr, err := CalculateEthBasedFee(balance.Balance, gaz, 21000, params.Amount) if err != nil { return dto.GetEthFeeResponse{}, responses.ResponseError{}, err } return fr, responses.ResponseError{}, nil } -func GetEthereumClassicFee(address string, amount string) (dto.GetEthFeeResponse, responses.ResponseError, error) { +func GetEthereumClassicFee(params *Params) (dto.GetEthFeeResponse, responses.ResponseError, error) { var fee responses.EthereumFeeResponse var feeErr, balanceErr responses.ResponseError var balance responses.CurrencyBalanceResponse @@ -153,7 +173,7 @@ func GetEthereumClassicFee(address string, amount string) (dto.GetEthFeeResponse go func() { defer wg.Done() - balance, balanceErr = api.GetEthereumClassicBalance(address) + balance, balanceErr = api.GetEthereumClassicBalance(params.Address) }() wg.Wait() @@ -163,14 +183,16 @@ func GetEthereumClassicFee(address string, amount string) (dto.GetEthFeeResponse return dto.GetEthFeeResponse{}, balanceErr, nil } - fr, err := CalculateEthBasedFee(balance.Balance, fee.GasPrice, 21000, amount) + _, gaz := speedControl(fee, params.Speed) + + fr, err := CalculateEthBasedFee(balance.Balance, gaz, 21000, params.Amount) if err != nil { return dto.GetEthFeeResponse{}, responses.ResponseError{}, err } return fr, responses.ResponseError{}, nil } -func GetTokenFee(address, tokenAddress, amount string) (dto.GetTokenFeeResponse, responses.ResponseError, error) { +func GetTokenFee(params *Params) (dto.GetTokenFeeResponse, responses.ResponseError, error) { var gasLimitErr, feeErr, balanceErr, tokenBalanceErr responses.ResponseError var gasLimit responses.TokenFeeResponse var fee responses.EthereumFeeResponse @@ -182,9 +204,9 @@ func GetTokenFee(address, tokenAddress, amount string) (dto.GetTokenFeeResponse, go func() { defer wg.Done() gasLimit, gasLimitErr = api.GetTokenGasLimit(requests.TokenGasLimitRequest{ - TokenAddress: tokenAddress, - ToAddress: address, - Amount: amount, + TokenAddress: params.TokenAddress, + ToAddress: params.Address, + Amount: params.Amount, }) }() @@ -195,12 +217,12 @@ func GetTokenFee(address, tokenAddress, amount string) (dto.GetTokenFeeResponse, go func() { defer wg.Done() - balance, balanceErr = api.GetEthereumBalance(address) + balance, balanceErr = api.GetEthereumBalance(params.Address) }() go func() { defer wg.Done() - tokenBalance, tokenBalanceErr = api.GetTokenBalance(address, tokenAddress) + tokenBalance, tokenBalanceErr = api.GetTokenBalance(params.Address, params.TokenAddress) if tokenBalance.Balance == "" { tokenBalance.Balance = "0" } @@ -220,21 +242,23 @@ func GetTokenFee(address, tokenAddress, amount string) (dto.GetTokenFeeResponse, return dto.GetTokenFeeResponse{}, tokenBalanceErr, nil } - fr, err := CalculateTokenFee(balance.Balance, tokenBalance.Balance, fee.GasPrice, gasLimit.GasLimit, amount) + _, gaz := speedControl(fee, params.Speed) + + fr, err := CalculateTokenFee(balance.Balance, tokenBalance.Balance, gaz, gasLimit.GasLimit, params.Amount) if err != nil { return dto.GetTokenFeeResponse{}, responses.ResponseError{}, err } return fr, responses.ResponseError{}, nil } -func GetWavesFee(address string, amount string) (dto.GetWavesAndStellarFeeResponse, responses.ResponseError, error) { - balance, apiErr := api.GetWavesBalance(address) +func GetWavesFee(params *Params) (dto.GetWavesAndStellarFeeResponse, responses.ResponseError, error) { + balance, apiErr := api.GetWavesBalance(params.Address) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetWavesAndStellarFeeResponse{}, apiErr, nil } maxAmount := balance.Balance - 300000 isEnough := true - if stringAmountToSatoshi(amount) > maxAmount { + if stringAmountToSatoshi(params.Amount) > maxAmount { isEnough = false if maxAmount < 0 { maxAmount = 0 @@ -250,12 +274,12 @@ func GetWavesFee(address string, amount string) (dto.GetWavesAndStellarFeeRespon }}, responses.ResponseError{}, nil } -func GetStellarFee(address string, amount string) (dto.GetWavesAndStellarFeeResponse, responses.ResponseError, error) { - balance, apiErr := api.GetStellarBalance(address) +func GetStellarFee(params *Params) (dto.GetWavesAndStellarFeeResponse, responses.ResponseError, error) { + balance, apiErr := api.GetStellarBalance(params.Address) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetWavesAndStellarFeeResponse{}, apiErr, nil } - fr := CalcStellarFee(balance.Balance, amount, 100) + fr := CalcStellarFee(balance.Balance, params.Amount, 100) return fr, responses.ResponseError{}, nil } @@ -270,3 +294,59 @@ func calcLitecoinFee(inputCount, outputCount, feePerByte int) int { func calcBitcoinCashFee(inputCount, outputCount, feePerByte int) int { return (inputCount*148 + outputCount*34 + 10) * feePerByte } + +func speedControl(t interface{}, speed string) (*feeCalculator, int) { + var f feeCalculator + var gaz int + + switch t.(type) { + case responses.BitcoinFeeResponse: + typed := t.(responses.BitcoinFeeResponse) + f.CalcFee = calcBitcoinFee + switch speed { + case "1": + f.FeePerByte = typed.HourFee + case "1.5": + f.FeePerByte = typed.HalfHourFee + case "2": + f.FeePerByte = typed.FastestFee + } + return &f, 0 + case responses.LitecoinFeeResponse: + typed := t.(responses.LitecoinFeeResponse) + f.CalcFee = calcLitecoinFee + switch speed { + case "1": + f.FeePerByte = typed.LowFeePerKb + case "1.5": + f.FeePerByte = typed.MediumFeePerKb + case "2": + f.FeePerByte = typed.HighFeePerKb + } + f.FeePerByte = f.FeePerByte / 1024 + return &f, 0 + case responses.EthereumFeeResponse: + typed := t.(responses.EthereumFeeResponse) + switch speed { + case "1": + gaz = typed.GasPrice * 10 / 8 + case "1.5": + gaz = typed.GasPrice + case "2": + gaz = typed.GasPrice + (typed.GasPrice * 10 / 5) + } + return nil, gaz + case responses.TokenFeeResponse: + typed := t.(responses.TokenFeeResponse) + switch speed { + case "1": + gaz = typed.GasLimit * 10 / 8 + case "1.5": + gaz = typed.GasLimit + case "2": + gaz = typed.GasLimit + (typed.GasLimit * 10 / 5) + } + return nil, gaz + } + return &f, gaz +} \ No newline at end of file diff --git a/services/server/handlers/fee.go b/services/server/handlers/fee.go index 4165d5b..cd43e81 100644 --- a/services/server/handlers/fee.go +++ b/services/server/handlers/fee.go @@ -18,8 +18,9 @@ func GetBitcoinFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetBitcoinFee(body.FromAddress, body.Amount, body.ReceiversCount) + res, apiErr, err := feeCalculator.GetBitcoinFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { @@ -39,8 +40,9 @@ func GetLitecoinFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetLitecoinFee(body.FromAddress, body.Amount, body.ReceiversCount) + res, apiErr, err := feeCalculator.GetLitecoinFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { c.JSON(statusCode, error) @@ -59,8 +61,9 @@ func GetBitcoinCashFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetBitcoinCashFee(body.FromAddress, body.Amount, body.ReceiversCount) + res, apiErr, err := feeCalculator.GetBitcoinCashFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { c.JSON(statusCode, error) @@ -76,8 +79,9 @@ func GetEthereumFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetEthereumFee(body.FromAddress, body.Amount) + res, apiErr, err := feeCalculator.GetEthereumFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { c.JSON(statusCode, error) @@ -95,7 +99,9 @@ func GetTokenFee(c *gin.Context) { return } - res, apiErr, err := feeCalculator.GetTokenFee(body.FromAddress, body.TokenAddress, body.Amount) + params := paramsProcessing(0, body.FromAddress, body.Amount, body.Speed, body.TokenAddress) + + res, apiErr, err := feeCalculator.GetTokenFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { @@ -113,8 +119,9 @@ func GetEthereumClassicFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetEthereumClassicFee(body.FromAddress, body.Amount) + res, apiErr, err := feeCalculator.GetEthereumClassicFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { @@ -132,8 +139,9 @@ func GetWavesFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetWavesFee(body.FromAddress, body.Amount) + res, apiErr, err := feeCalculator.GetWavesFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { c.JSON(statusCode, error) @@ -150,8 +158,9 @@ func GetStellarFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetStellarFee(body.FromAddress, body.Amount) + res, apiErr, err := feeCalculator.GetStellarFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { @@ -162,6 +171,7 @@ func GetStellarFee(c *gin.Context) { c.JSON(http.StatusOK, res) } + func ErrorCheck(err error, apiError responses.ResponseError) (bool, int, errors.ApiError) { if ok, statusCode, message := handleError(err); ok { return true, statusCode, message @@ -170,3 +180,18 @@ func ErrorCheck(err error, apiError responses.ResponseError) (bool, int, errors. } return false, 0, errors.ApiError{} } + +func paramsProcessing(i int, address, amount, speed, tokenAddress string) *feeCalculator.Params { + var p feeCalculator.Params + if speed != "" { + p.Speed = speed + } else { + p.Speed = "1.5" + } + p.TokenAddress = tokenAddress + p.Address = address + p.ReceiversCount = i + p.Amount = amount + + return &p +} From 1057f6d41c85df8b3830940ac6067176378b16f6 Mon Sep 17 00:00:00 2001 From: jeyldii Date: Sun, 20 Oct 2019 13:39:43 +0300 Subject: [PATCH 2/5] Fee service --- dto/apiRequests.go | 2 + services/feeCalculator/feeCalculator.go | 154 ++++++++++++++++++------ services/server/handlers/fee.go | 41 +++++-- 3 files changed, 152 insertions(+), 45 deletions(-) diff --git a/dto/apiRequests.go b/dto/apiRequests.go index d43543c..75528b4 100644 --- a/dto/apiRequests.go +++ b/dto/apiRequests.go @@ -8,9 +8,11 @@ type SharedApiReq struct { type GetFeeRequest struct { *SharedApiReq ReceiversCount int `json:"receiversCount"` + Speed string `json:"speed,omitempty"` } type GetTokenFeeRequest struct { *SharedApiReq TokenAddress string `json:"tokenAddress"` + Speed string `json:"speed,omitempty"` } diff --git a/services/feeCalculator/feeCalculator.go b/services/feeCalculator/feeCalculator.go index 74f591b..e2e1160 100644 --- a/services/feeCalculator/feeCalculator.go +++ b/services/feeCalculator/feeCalculator.go @@ -14,7 +14,15 @@ type feeCalculator struct { FeePerByte int } -func GetBitcoinFee(address string, amount string, receiversCount int) (dto.GetFeeResponse, responses.ResponseError, error) { +type Params struct { + Address string + Amount string + ReceiversCount int + Speed string + TokenAddress string +} + +func GetBitcoinFee(params *Params) (dto.GetFeeResponse, responses.ResponseError, error) { var utxos responses.UtxoResponse var apiUtxoErr, apiFeeErr responses.ResponseError @@ -25,7 +33,7 @@ func GetBitcoinFee(address string, amount string, receiversCount int) (dto.GetFe wg.Add(2) go func() { defer wg.Done() - utxos, apiUtxoErr = api.GetUtxo(address, "btc") + utxos, apiUtxoErr = api.GetUtxo(params.Address, "btc") }() go func() { @@ -39,12 +47,22 @@ func GetBitcoinFee(address string, amount string, receiversCount int) (dto.GetFe } else if apiUtxoErr.Error != nil || apiUtxoErr.ApiError != nil { return dto.GetFeeResponse{}, apiUtxoErr, nil } - - fee, apiErr := calcUtxoFee(utxos.Utxo, amount, receiversCount, feeCalculator{ - CalcFee: calcBitcoinFee, - MinFeePerByte: 10, - FeePerByte: feePerByte.HalfHourFee, - }) + + f, _ := speedControl(feePerByte, params.Speed) + // todo : complete + f.MinFeePerByte = 10 + + // Test + //switch params.Speed { + //case "1": + // f.FeePerByte = feePerByte.HourFee + //case "1.5": + // f.FeePerByte = feePerByte.HalfHourFee + //case "2": + // f.FeePerByte = feePerByte.FastestFee + //} + + fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, *f) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetFeeResponse{}, apiErr, nil } @@ -52,7 +70,7 @@ func GetBitcoinFee(address string, amount string, receiversCount int) (dto.GetFe return fee, responses.ResponseError{}, nil } -func GetLitecoinFee(address string, amount string, receiversCount int) (dto.GetFeeResponse, responses.ResponseError, error) { +func GetLitecoinFee(params *Params) (dto.GetFeeResponse, responses.ResponseError, error) { var utxos responses.UtxoResponse var apiUtxoErr, apiFeeErr responses.ResponseError @@ -63,7 +81,7 @@ func GetLitecoinFee(address string, amount string, receiversCount int) (dto.GetF wg.Add(2) go func() { defer wg.Done() - utxos, apiUtxoErr = api.GetUtxo(address, "ltc") + utxos, apiUtxoErr = api.GetUtxo(params.Address, "ltc") }() go func() { @@ -78,23 +96,23 @@ func GetLitecoinFee(address string, amount string, receiversCount int) (dto.GetF return dto.GetFeeResponse{}, apiUtxoErr, nil } - fee, apiErr := calcUtxoFee(utxos.Utxo, amount, receiversCount, feeCalculator{ - CalcFee: calcLitecoinFee, - MinFeePerByte: 8, - FeePerByte: feePerByte.MediumFeePerKb / 1024, - }) + f, _ := speedControl(feePerByte, params.Speed) + // todo : complete + f.MinFeePerByte = 8 + + fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, *f) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetFeeResponse{}, apiErr, nil } return fee, responses.ResponseError{}, nil } -func GetBitcoinCashFee(address string, amount string, receiversCount int) (dto.GetFeeResponse, responses.ResponseError, error) { - utxos, apiErr := api.GetUtxo(address, "bch") +func GetBitcoinCashFee(params *Params) (dto.GetFeeResponse, responses.ResponseError, error) { + utxos, apiErr := api.GetUtxo(params.Address, "bch") if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetFeeResponse{}, apiErr, nil } - fee, apiErr := calcUtxoFee(utxos.Utxo, amount, receiversCount, feeCalculator{ + fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, feeCalculator{ CalcFee: calcBitcoinCashFee, MinFeePerByte: 1, FeePerByte: 3, @@ -105,7 +123,7 @@ func GetBitcoinCashFee(address string, amount string, receiversCount int) (dto.G return fee, responses.ResponseError{}, nil } -func GetEthereumFee(address string, amount string) (dto.GetEthFeeResponse, responses.ResponseError, error) { +func GetEthereumFee(params *Params) (dto.GetEthFeeResponse, responses.ResponseError, error) { var fee responses.EthereumFeeResponse var feeErr, balanceErr responses.ResponseError @@ -121,7 +139,7 @@ func GetEthereumFee(address string, amount string) (dto.GetEthFeeResponse, respo go func() { defer wg.Done() - balance, balanceErr = api.GetEthereumBalance(address) + balance, balanceErr = api.GetEthereumBalance(params.Address) }() wg.Wait() @@ -131,14 +149,16 @@ func GetEthereumFee(address string, amount string) (dto.GetEthFeeResponse, respo return dto.GetEthFeeResponse{}, balanceErr, nil } - fr, err := CalculateEthBasedFee(balance.Balance, fee.GasPrice, 21000, amount) + _, gaz := speedControl(fee, params.Speed) + + fr, err := CalculateEthBasedFee(balance.Balance, gaz, 21000, params.Amount) if err != nil { return dto.GetEthFeeResponse{}, responses.ResponseError{}, err } return fr, responses.ResponseError{}, nil } -func GetEthereumClassicFee(address string, amount string) (dto.GetEthFeeResponse, responses.ResponseError, error) { +func GetEthereumClassicFee(params *Params) (dto.GetEthFeeResponse, responses.ResponseError, error) { var fee responses.EthereumFeeResponse var feeErr, balanceErr responses.ResponseError var balance responses.CurrencyBalanceResponse @@ -153,7 +173,7 @@ func GetEthereumClassicFee(address string, amount string) (dto.GetEthFeeResponse go func() { defer wg.Done() - balance, balanceErr = api.GetEthereumClassicBalance(address) + balance, balanceErr = api.GetEthereumClassicBalance(params.Address) }() wg.Wait() @@ -163,14 +183,16 @@ func GetEthereumClassicFee(address string, amount string) (dto.GetEthFeeResponse return dto.GetEthFeeResponse{}, balanceErr, nil } - fr, err := CalculateEthBasedFee(balance.Balance, fee.GasPrice, 21000, amount) + _, gaz := speedControl(fee, params.Speed) + + fr, err := CalculateEthBasedFee(balance.Balance, gaz, 21000, params.Amount) if err != nil { return dto.GetEthFeeResponse{}, responses.ResponseError{}, err } return fr, responses.ResponseError{}, nil } -func GetTokenFee(address, tokenAddress, amount string) (dto.GetTokenFeeResponse, responses.ResponseError, error) { +func GetTokenFee(params *Params) (dto.GetTokenFeeResponse, responses.ResponseError, error) { var gasLimitErr, feeErr, balanceErr, tokenBalanceErr responses.ResponseError var gasLimit responses.TokenFeeResponse var fee responses.EthereumFeeResponse @@ -182,9 +204,9 @@ func GetTokenFee(address, tokenAddress, amount string) (dto.GetTokenFeeResponse, go func() { defer wg.Done() gasLimit, gasLimitErr = api.GetTokenGasLimit(requests.TokenGasLimitRequest{ - TokenAddress: tokenAddress, - ToAddress: address, - Amount: amount, + TokenAddress: params.TokenAddress, + ToAddress: params.Address, + Amount: params.Amount, }) }() @@ -195,12 +217,12 @@ func GetTokenFee(address, tokenAddress, amount string) (dto.GetTokenFeeResponse, go func() { defer wg.Done() - balance, balanceErr = api.GetEthereumBalance(address) + balance, balanceErr = api.GetEthereumBalance(params.Address) }() go func() { defer wg.Done() - tokenBalance, tokenBalanceErr = api.GetTokenBalance(address, tokenAddress) + tokenBalance, tokenBalanceErr = api.GetTokenBalance(params.Address, params.TokenAddress) if tokenBalance.Balance == "" { tokenBalance.Balance = "0" } @@ -220,21 +242,23 @@ func GetTokenFee(address, tokenAddress, amount string) (dto.GetTokenFeeResponse, return dto.GetTokenFeeResponse{}, tokenBalanceErr, nil } - fr, err := CalculateTokenFee(balance.Balance, tokenBalance.Balance, fee.GasPrice, gasLimit.GasLimit, amount) + _, gaz := speedControl(fee, params.Speed) + + fr, err := CalculateTokenFee(balance.Balance, tokenBalance.Balance, gaz, gasLimit.GasLimit, params.Amount) if err != nil { return dto.GetTokenFeeResponse{}, responses.ResponseError{}, err } return fr, responses.ResponseError{}, nil } -func GetWavesFee(address string, amount string) (dto.GetWavesAndStellarFeeResponse, responses.ResponseError, error) { - balance, apiErr := api.GetWavesBalance(address) +func GetWavesFee(params *Params) (dto.GetWavesAndStellarFeeResponse, responses.ResponseError, error) { + balance, apiErr := api.GetWavesBalance(params.Address) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetWavesAndStellarFeeResponse{}, apiErr, nil } maxAmount := balance.Balance - 300000 isEnough := true - if stringAmountToSatoshi(amount) > maxAmount { + if stringAmountToSatoshi(params.Amount) > maxAmount { isEnough = false if maxAmount < 0 { maxAmount = 0 @@ -250,12 +274,12 @@ func GetWavesFee(address string, amount string) (dto.GetWavesAndStellarFeeRespon }}, responses.ResponseError{}, nil } -func GetStellarFee(address string, amount string) (dto.GetWavesAndStellarFeeResponse, responses.ResponseError, error) { - balance, apiErr := api.GetStellarBalance(address) +func GetStellarFee(params *Params) (dto.GetWavesAndStellarFeeResponse, responses.ResponseError, error) { + balance, apiErr := api.GetStellarBalance(params.Address) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetWavesAndStellarFeeResponse{}, apiErr, nil } - fr := CalcStellarFee(balance.Balance, amount, 100) + fr := CalcStellarFee(balance.Balance, params.Amount, 100) return fr, responses.ResponseError{}, nil } @@ -270,3 +294,59 @@ func calcLitecoinFee(inputCount, outputCount, feePerByte int) int { func calcBitcoinCashFee(inputCount, outputCount, feePerByte int) int { return (inputCount*148 + outputCount*34 + 10) * feePerByte } + +func speedControl(t interface{}, speed string) (*feeCalculator, int) { + var f feeCalculator + var gaz int + + switch t.(type) { + case responses.BitcoinFeeResponse: + typed := t.(responses.BitcoinFeeResponse) + f.CalcFee = calcBitcoinFee + switch speed { + case "1": + f.FeePerByte = typed.HourFee + case "1.5": + f.FeePerByte = typed.HalfHourFee + case "2": + f.FeePerByte = typed.FastestFee + } + return &f, 0 + case responses.LitecoinFeeResponse: + typed := t.(responses.LitecoinFeeResponse) + f.CalcFee = calcLitecoinFee + switch speed { + case "1": + f.FeePerByte = typed.LowFeePerKb + case "1.5": + f.FeePerByte = typed.MediumFeePerKb + case "2": + f.FeePerByte = typed.HighFeePerKb + } + f.FeePerByte = f.FeePerByte / 1024 + return &f, 0 + case responses.EthereumFeeResponse: + typed := t.(responses.EthereumFeeResponse) + switch speed { + case "1": + gaz = typed.GasPrice * 10 / 8 + case "1.5": + gaz = typed.GasPrice + case "2": + gaz = typed.GasPrice + (typed.GasPrice * 10 / 5) + } + return nil, gaz + case responses.TokenFeeResponse: + typed := t.(responses.TokenFeeResponse) + switch speed { + case "1": + gaz = typed.GasLimit * 10 / 8 + case "1.5": + gaz = typed.GasLimit + case "2": + gaz = typed.GasLimit + (typed.GasLimit * 10 / 5) + } + return nil, gaz + } + return &f, gaz +} \ No newline at end of file diff --git a/services/server/handlers/fee.go b/services/server/handlers/fee.go index 4165d5b..cd43e81 100644 --- a/services/server/handlers/fee.go +++ b/services/server/handlers/fee.go @@ -18,8 +18,9 @@ func GetBitcoinFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetBitcoinFee(body.FromAddress, body.Amount, body.ReceiversCount) + res, apiErr, err := feeCalculator.GetBitcoinFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { @@ -39,8 +40,9 @@ func GetLitecoinFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetLitecoinFee(body.FromAddress, body.Amount, body.ReceiversCount) + res, apiErr, err := feeCalculator.GetLitecoinFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { c.JSON(statusCode, error) @@ -59,8 +61,9 @@ func GetBitcoinCashFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetBitcoinCashFee(body.FromAddress, body.Amount, body.ReceiversCount) + res, apiErr, err := feeCalculator.GetBitcoinCashFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { c.JSON(statusCode, error) @@ -76,8 +79,9 @@ func GetEthereumFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetEthereumFee(body.FromAddress, body.Amount) + res, apiErr, err := feeCalculator.GetEthereumFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { c.JSON(statusCode, error) @@ -95,7 +99,9 @@ func GetTokenFee(c *gin.Context) { return } - res, apiErr, err := feeCalculator.GetTokenFee(body.FromAddress, body.TokenAddress, body.Amount) + params := paramsProcessing(0, body.FromAddress, body.Amount, body.Speed, body.TokenAddress) + + res, apiErr, err := feeCalculator.GetTokenFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { @@ -113,8 +119,9 @@ func GetEthereumClassicFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetEthereumClassicFee(body.FromAddress, body.Amount) + res, apiErr, err := feeCalculator.GetEthereumClassicFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { @@ -132,8 +139,9 @@ func GetWavesFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetWavesFee(body.FromAddress, body.Amount) + res, apiErr, err := feeCalculator.GetWavesFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { c.JSON(statusCode, error) @@ -150,8 +158,9 @@ func GetStellarFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } + params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") - res, apiErr, err := feeCalculator.GetStellarFee(body.FromAddress, body.Amount) + res, apiErr, err := feeCalculator.GetStellarFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) if isErr { @@ -162,6 +171,7 @@ func GetStellarFee(c *gin.Context) { c.JSON(http.StatusOK, res) } + func ErrorCheck(err error, apiError responses.ResponseError) (bool, int, errors.ApiError) { if ok, statusCode, message := handleError(err); ok { return true, statusCode, message @@ -170,3 +180,18 @@ func ErrorCheck(err error, apiError responses.ResponseError) (bool, int, errors. } return false, 0, errors.ApiError{} } + +func paramsProcessing(i int, address, amount, speed, tokenAddress string) *feeCalculator.Params { + var p feeCalculator.Params + if speed != "" { + p.Speed = speed + } else { + p.Speed = "1.5" + } + p.TokenAddress = tokenAddress + p.Address = address + p.ReceiversCount = i + p.Amount = amount + + return &p +} From 9ed1f12bda68fdb31f765a6d5ff7f920c45c19f3 Mon Sep 17 00:00:00 2001 From: jeyldii Date: Sun, 20 Oct 2019 16:30:36 +0300 Subject: [PATCH 3/5] help functions refs, add minFeePerByte checking --- services/feeCalculator/feeCalculator.go | 115 ++++++++++++------------ services/server/handlers/fee.go | 82 ++++++++++++----- 2 files changed, 120 insertions(+), 77 deletions(-) diff --git a/services/feeCalculator/feeCalculator.go b/services/feeCalculator/feeCalculator.go index e2e1160..71df385 100644 --- a/services/feeCalculator/feeCalculator.go +++ b/services/feeCalculator/feeCalculator.go @@ -8,12 +8,6 @@ import ( "sync" ) -type feeCalculator struct { - CalcFee func(int, int, int) int - MinFeePerByte int - FeePerByte int -} - type Params struct { Address string Amount string @@ -22,6 +16,12 @@ type Params struct { TokenAddress string } +type feeCalculator struct { + CalcFee func(int, int, int) int + MinFeePerByte int + FeePerByte int +} + func GetBitcoinFee(params *Params) (dto.GetFeeResponse, responses.ResponseError, error) { var utxos responses.UtxoResponse @@ -48,21 +48,9 @@ func GetBitcoinFee(params *Params) (dto.GetFeeResponse, responses.ResponseError, return dto.GetFeeResponse{}, apiUtxoErr, nil } - f, _ := speedControl(feePerByte, params.Speed) - // todo : complete - f.MinFeePerByte = 10 - - // Test - //switch params.Speed { - //case "1": - // f.FeePerByte = feePerByte.HourFee - //case "1.5": - // f.FeePerByte = feePerByte.HalfHourFee - //case "2": - // f.FeePerByte = feePerByte.FastestFee - //} - - fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, *f) + feeCounted, _ := speedControl(feePerByte, params.Speed) + + fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, *feeCounted) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetFeeResponse{}, apiErr, nil } @@ -96,11 +84,11 @@ func GetLitecoinFee(params *Params) (dto.GetFeeResponse, responses.ResponseError return dto.GetFeeResponse{}, apiUtxoErr, nil } - f, _ := speedControl(feePerByte, params.Speed) + feeCounted, _ := speedControl(feePerByte, params.Speed) // todo : complete - f.MinFeePerByte = 8 + feeCounted.MinFeePerByte = 8 - fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, *f) + fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, *feeCounted) if apiErr.Error != nil || apiErr.ApiError != nil { return dto.GetFeeResponse{}, apiErr, nil } @@ -149,9 +137,9 @@ func GetEthereumFee(params *Params) (dto.GetEthFeeResponse, responses.ResponseEr return dto.GetEthFeeResponse{}, balanceErr, nil } - _, gaz := speedControl(fee, params.Speed) + _, gasPrice := speedControl(fee, params.Speed) - fr, err := CalculateEthBasedFee(balance.Balance, gaz, 21000, params.Amount) + fr, err := CalculateEthBasedFee(balance.Balance, gasPrice, 21000, params.Amount) if err != nil { return dto.GetEthFeeResponse{}, responses.ResponseError{}, err } @@ -183,9 +171,9 @@ func GetEthereumClassicFee(params *Params) (dto.GetEthFeeResponse, responses.Res return dto.GetEthFeeResponse{}, balanceErr, nil } - _, gaz := speedControl(fee, params.Speed) + _, gasPrice := speedControl(fee, params.Speed) - fr, err := CalculateEthBasedFee(balance.Balance, gaz, 21000, params.Amount) + fr, err := CalculateEthBasedFee(balance.Balance, gasPrice, 21000, params.Amount) if err != nil { return dto.GetEthFeeResponse{}, responses.ResponseError{}, err } @@ -242,9 +230,9 @@ func GetTokenFee(params *Params) (dto.GetTokenFeeResponse, responses.ResponseErr return dto.GetTokenFeeResponse{}, tokenBalanceErr, nil } - _, gaz := speedControl(fee, params.Speed) + _, gasPrice := speedControl(fee, params.Speed) - fr, err := CalculateTokenFee(balance.Balance, tokenBalance.Balance, gaz, gasLimit.GasLimit, params.Amount) + fr, err := CalculateTokenFee(balance.Balance, tokenBalance.Balance, gasPrice, gasLimit.GasLimit, params.Amount) if err != nil { return dto.GetTokenFeeResponse{}, responses.ResponseError{}, err } @@ -296,57 +284,74 @@ func calcBitcoinCashFee(inputCount, outputCount, feePerByte int) int { } func speedControl(t interface{}, speed string) (*feeCalculator, int) { - var f feeCalculator - var gaz int + var ( + f feeCalculator + gasPrice int + ) switch t.(type) { case responses.BitcoinFeeResponse: typed := t.(responses.BitcoinFeeResponse) f.CalcFee = calcBitcoinFee switch speed { - case "1": + case "slow": f.FeePerByte = typed.HourFee - case "1.5": + case "average": f.FeePerByte = typed.HalfHourFee - case "2": + case "fast": f.FeePerByte = typed.FastestFee + default: + f.FeePerByte = typed.HourFee + } + if f.FeePerByte <= 10 { + f.MinFeePerByte = f .FeePerByte - 1 + } else { + f.MinFeePerByte = 10 } - return &f, 0 case responses.LitecoinFeeResponse: typed := t.(responses.LitecoinFeeResponse) f.CalcFee = calcLitecoinFee switch speed { - case "1": + case "slow": f.FeePerByte = typed.LowFeePerKb - case "1.5": + case "average": f.FeePerByte = typed.MediumFeePerKb - case "2": + case "fast": f.FeePerByte = typed.HighFeePerKb + default: + f.FeePerByte = typed.MediumFeePerKb } f.FeePerByte = f.FeePerByte / 1024 - return &f, 0 + if f.FeePerByte <= 8 { + f.MinFeePerByte = f .FeePerByte - 1 + } else { + f.MinFeePerByte = 8 + } case responses.EthereumFeeResponse: typed := t.(responses.EthereumFeeResponse) switch speed { - case "1": - gaz = typed.GasPrice * 10 / 8 - case "1.5": - gaz = typed.GasPrice - case "2": - gaz = typed.GasPrice + (typed.GasPrice * 10 / 5) + case "slow": + gasPrice = typed.GasPrice * 10 / 8 + case "average": + gasPrice = typed.GasPrice + case "fast": + gasPrice = typed.GasPrice + (typed.GasPrice * 10 / 5) + default: + gasPrice = typed.GasPrice } - return nil, gaz case responses.TokenFeeResponse: typed := t.(responses.TokenFeeResponse) switch speed { - case "1": - gaz = typed.GasLimit * 10 / 8 - case "1.5": - gaz = typed.GasLimit - case "2": - gaz = typed.GasLimit + (typed.GasLimit * 10 / 5) + case "slow": + gasPrice = typed.GasLimit * 10 / 8 + case "average": + gasPrice = typed.GasLimit + case "fast": + gasPrice = typed.GasLimit + (typed.GasLimit * 10 / 5) + default: + gasPrice = typed.GasLimit } - return nil, gaz } - return &f, gaz + + return &f, gasPrice } \ No newline at end of file diff --git a/services/server/handlers/fee.go b/services/server/handlers/fee.go index cd43e81..e45af1d 100644 --- a/services/server/handlers/fee.go +++ b/services/server/handlers/fee.go @@ -18,7 +18,13 @@ func GetBitcoinFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } - params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") + params := paramsProcessing(feeCalculator.Params{ + Address: body.FromAddress, + Amount: body.Amount, + ReceiversCount: body.ReceiversCount, + Speed: body.Speed, + TokenAddress: "", + }) res, apiErr, err := feeCalculator.GetBitcoinFee(params) @@ -40,7 +46,13 @@ func GetLitecoinFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } - params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") + params := paramsProcessing(feeCalculator.Params{ + Address: body.FromAddress, + Amount: body.Amount, + ReceiversCount: body.ReceiversCount, + Speed: body.Speed, + TokenAddress: "", + }) res, apiErr, err := feeCalculator.GetLitecoinFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) @@ -61,7 +73,13 @@ func GetBitcoinCashFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } - params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") + params := paramsProcessing(feeCalculator.Params{ + Address: body.FromAddress, + Amount: body.Amount, + ReceiversCount: body.ReceiversCount, + Speed: body.Speed, + TokenAddress: "", + }) res, apiErr, err := feeCalculator.GetBitcoinCashFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) @@ -79,7 +97,13 @@ func GetEthereumFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } - params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") + params := paramsProcessing(feeCalculator.Params{ + Address: body.FromAddress, + Amount: body.Amount, + ReceiversCount: body.ReceiversCount, + Speed: body.Speed, + TokenAddress: "", + }) res, apiErr, err := feeCalculator.GetEthereumFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) @@ -98,8 +122,13 @@ func GetTokenFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } - - params := paramsProcessing(0, body.FromAddress, body.Amount, body.Speed, body.TokenAddress) + params := paramsProcessing(feeCalculator.Params{ + Address: body.FromAddress, + Amount: body.Amount, + ReceiversCount: 0, + Speed: body.Speed, + TokenAddress: body.TokenAddress, + }) res, apiErr, err := feeCalculator.GetTokenFee(params) @@ -119,7 +148,13 @@ func GetEthereumClassicFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } - params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") + params := paramsProcessing(feeCalculator.Params{ + Address: body.FromAddress, + Amount: body.Amount, + ReceiversCount: body.ReceiversCount, + Speed: body.Speed, + TokenAddress: "", + }) res, apiErr, err := feeCalculator.GetEthereumClassicFee(params) @@ -139,7 +174,13 @@ func GetWavesFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } - params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") + params := paramsProcessing(feeCalculator.Params{ + Address: body.FromAddress, + Amount: body.Amount, + ReceiversCount: body.ReceiversCount, + Speed: body.Speed, + TokenAddress: "", + }) res, apiErr, err := feeCalculator.GetWavesFee(params) isErr, statusCode, error := ErrorCheck(err, apiErr) @@ -158,7 +199,13 @@ func GetStellarFee(c *gin.Context) { c.JSON(http.StatusBadRequest, errors.BadRequestMessage) return } - params := paramsProcessing(body.ReceiversCount, body.FromAddress, body.Amount, body.Speed, "") + params := paramsProcessing(feeCalculator.Params{ + Address: body.FromAddress, + Amount: body.Amount, + ReceiversCount: body.ReceiversCount, + Speed: body.Speed, + TokenAddress: "", + }) res, apiErr, err := feeCalculator.GetStellarFee(params) @@ -171,7 +218,6 @@ func GetStellarFee(c *gin.Context) { c.JSON(http.StatusOK, res) } - func ErrorCheck(err error, apiError responses.ResponseError) (bool, int, errors.ApiError) { if ok, statusCode, message := handleError(err); ok { return true, statusCode, message @@ -181,17 +227,9 @@ func ErrorCheck(err error, apiError responses.ResponseError) (bool, int, errors. return false, 0, errors.ApiError{} } -func paramsProcessing(i int, address, amount, speed, tokenAddress string) *feeCalculator.Params { - var p feeCalculator.Params - if speed != "" { - p.Speed = speed - } else { - p.Speed = "1.5" +func paramsProcessing(params feeCalculator.Params) *feeCalculator.Params { + if params.Speed != "low" && params.Speed != "average" && params.Speed != "fast" || params.Speed == "" { + params.Speed = "average" } - p.TokenAddress = tokenAddress - p.Address = address - p.ReceiversCount = i - p.Amount = amount - - return &p + return ¶ms } From 1f14541caee2fb8f5760d026c2b7bcad84d4d39f Mon Sep 17 00:00:00 2001 From: jeyldii Date: Sun, 20 Oct 2019 18:36:38 +0300 Subject: [PATCH 4/5] help functions refs, add minFeePerByte checking, gofmt.../ --- dto/apiRequests.go | 6 +++--- services/feeCalculator/feeCalculator.go | 18 +++++++++--------- services/feeCalculator/utxoBlockchain.go | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/dto/apiRequests.go b/dto/apiRequests.go index 75528b4..0f9382d 100644 --- a/dto/apiRequests.go +++ b/dto/apiRequests.go @@ -7,12 +7,12 @@ type SharedApiReq struct { type GetFeeRequest struct { *SharedApiReq - ReceiversCount int `json:"receiversCount"` - Speed string `json:"speed,omitempty"` + ReceiversCount int `json:"receiversCount"` + Speed string `json:"speed,omitempty"` } type GetTokenFeeRequest struct { *SharedApiReq TokenAddress string `json:"tokenAddress"` - Speed string `json:"speed,omitempty"` + Speed string `json:"speed,omitempty"` } diff --git a/services/feeCalculator/feeCalculator.go b/services/feeCalculator/feeCalculator.go index 71df385..b6a1c47 100644 --- a/services/feeCalculator/feeCalculator.go +++ b/services/feeCalculator/feeCalculator.go @@ -9,11 +9,11 @@ import ( ) type Params struct { - Address string - Amount string + Address string + Amount string ReceiversCount int - Speed string - TokenAddress string + Speed string + TokenAddress string } type feeCalculator struct { @@ -47,7 +47,7 @@ func GetBitcoinFee(params *Params) (dto.GetFeeResponse, responses.ResponseError, } else if apiUtxoErr.Error != nil || apiUtxoErr.ApiError != nil { return dto.GetFeeResponse{}, apiUtxoErr, nil } - + feeCounted, _ := speedControl(feePerByte, params.Speed) fee, apiErr := calcUtxoFee(utxos.Utxo, params.Amount, params.ReceiversCount, *feeCounted) @@ -285,7 +285,7 @@ func calcBitcoinCashFee(inputCount, outputCount, feePerByte int) int { func speedControl(t interface{}, speed string) (*feeCalculator, int) { var ( - f feeCalculator + f feeCalculator gasPrice int ) @@ -304,7 +304,7 @@ func speedControl(t interface{}, speed string) (*feeCalculator, int) { f.FeePerByte = typed.HourFee } if f.FeePerByte <= 10 { - f.MinFeePerByte = f .FeePerByte - 1 + f.MinFeePerByte = f.FeePerByte - 1 } else { f.MinFeePerByte = 10 } @@ -323,7 +323,7 @@ func speedControl(t interface{}, speed string) (*feeCalculator, int) { } f.FeePerByte = f.FeePerByte / 1024 if f.FeePerByte <= 8 { - f.MinFeePerByte = f .FeePerByte - 1 + f.MinFeePerByte = f.FeePerByte - 1 } else { f.MinFeePerByte = 8 } @@ -354,4 +354,4 @@ func speedControl(t interface{}, speed string) (*feeCalculator, int) { } return &f, gasPrice -} \ No newline at end of file +} diff --git a/services/feeCalculator/utxoBlockchain.go b/services/feeCalculator/utxoBlockchain.go index 0a8576e..eb8fadc 100644 --- a/services/feeCalculator/utxoBlockchain.go +++ b/services/feeCalculator/utxoBlockchain.go @@ -50,7 +50,7 @@ func calcUtxoFee(utxos []responses.Utxo, amount string, receiversCount int, feeC MaxAmount: uint64(ux.MaxAmount), MaxAmountWithOptimalFee: uint64(ux.MaxUsefulAmount), }, - Inputs: []responses.Utxo{}, + Inputs: []responses.Utxo{}, FeePerByte: feeCalculator.FeePerByte, } result.Input = ux.MinInputs - 1 @@ -62,7 +62,7 @@ func calcUtxoFee(utxos []responses.Utxo, amount string, receiversCount int, feeC result.IsEnough = true result.Output = receiversCount iterationBalance := ux.LastIterationBalance - maxIterations := len(ux.UsefulUtxos)+len(ux.UselessUtxos) + maxIterations := len(ux.UsefulUtxos) + len(ux.UselessUtxos) for i := ux.MinInputs - 1; i < maxIterations; i++ { result.Input++ From 27fcbc639f5d5211a0d5e9b3c44dac5f805b083c Mon Sep 17 00:00:00 2001 From: Ivan Frolov <45122314+jeyldii@users.noreply.github.com> Date: Sun, 27 Oct 2019 18:47:56 +0300 Subject: [PATCH 5/5] Update feeCalculator.go --- services/feeCalculator/feeCalculator.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/services/feeCalculator/feeCalculator.go b/services/feeCalculator/feeCalculator.go index b6a1c47..d3c84bf 100644 --- a/services/feeCalculator/feeCalculator.go +++ b/services/feeCalculator/feeCalculator.go @@ -339,18 +339,6 @@ func speedControl(t interface{}, speed string) (*feeCalculator, int) { default: gasPrice = typed.GasPrice } - case responses.TokenFeeResponse: - typed := t.(responses.TokenFeeResponse) - switch speed { - case "slow": - gasPrice = typed.GasLimit * 10 / 8 - case "average": - gasPrice = typed.GasLimit - case "fast": - gasPrice = typed.GasLimit + (typed.GasLimit * 10 / 5) - default: - gasPrice = typed.GasLimit - } } return &f, gasPrice