diff --git a/pkg/entities/wallet_utils.go b/pkg/entities/wallet_utils.go index d96f6f73..42d6fd51 100644 --- a/pkg/entities/wallet_utils.go +++ b/pkg/entities/wallet_utils.go @@ -237,18 +237,37 @@ func (e *Entity) FormatAsset(assets []response.BinanceUserAssetResponse) ([]resp continue } - assetValue, err := strconv.ParseFloat(asset.Free, 64) + assetFree, err := strconv.ParseFloat(asset.Free, 64) if err != nil { e.log.Error(err, "[entities.SumarizeBinanceAsset] Failed to parse asset value") return nil, err } + assetLocked, err := strconv.ParseFloat(asset.Locked, 64) + if err != nil { + e.log.Error(err, "[entities.SumarizeBinanceAsset] Failed to parse asset value") + return nil, err + } + + assetValue := assetFree + assetLocked + btcValuation, err := strconv.ParseFloat(asset.BtcValuation, 64) if err != nil { e.log.Error(err, "[entities.SumarizeBinanceAsset] Failed to parse asset value") return nil, err } + usdBal := btcValuation * btcPrice["bitcoin"] + if usdBal <= 0 { + binancePrice, err := e.svc.Binance.GetPrice(asset.Asset + "USDT") + if err != nil { + e.log.Error(err, "[entities.SumarizeBinanceAsset] Failed to get binance price") + return nil, err + } + + usdBal, _ = strconv.ParseFloat(binancePrice.Price, 64) + } + itm := response.WalletAssetData{ AssetBalance: assetValue, Amount: util.FloatToString(fmt.Sprint(assetValue), 18), @@ -257,7 +276,7 @@ func (e *Entity) FormatAsset(assets []response.BinanceUserAssetResponse) ([]resp Decimal: 18, Price: btcValuation * btcPrice["bitcoin"] / assetValue, }, - UsdBalance: btcValuation * btcPrice["bitcoin"], + UsdBalance: usdBal, } if asset.DetailLending != nil && asset.DetailLending.Amount != "0" { diff --git a/pkg/response/binance.go b/pkg/response/binance.go index f2bcf028..cd4ba7d0 100644 --- a/pkg/response/binance.go +++ b/pkg/response/binance.go @@ -212,3 +212,8 @@ type BinanceFuturePositionInfo struct { PositionSide string `json:"positionSide"` UpdateTime int64 `json:"updateTime"` } + +type BinanceApiTickerPriceResponse struct { + Symbol string `json:"symbol"` + Price string `json:"price"` +} diff --git a/pkg/service/binance/adapter/adapter.go b/pkg/service/binance/adapter/adapter.go index dee0789e..9f0f5528 100644 --- a/pkg/service/binance/adapter/adapter.go +++ b/pkg/service/binance/adapter/adapter.go @@ -312,3 +312,25 @@ func GetFutureAccountInfo(apiKey, apiSecret string) (fAccountBal []response.Bina return fAccountBal, nil } + +func GetTickerPrice(symbol string) (price *response.BinanceApiTickerPriceResponse, err error) { + // http request + req, err := http.NewRequest("GET", url+"/api/v3/ticker/price?symbol="+symbol, nil) + if err != nil { + return nil, err + } + + resp, err := do(req, "", 0) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + // decode response json + err = json.NewDecoder(resp.Body).Decode(&price) + if err != nil { + return nil, err + } + + return price, nil +} diff --git a/pkg/service/binance/binance.go b/pkg/service/binance/binance.go index 8ee33f2f..28a729e8 100644 --- a/pkg/service/binance/binance.go +++ b/pkg/service/binance/binance.go @@ -509,3 +509,7 @@ func (b *Binance) GetFutureAccountInfo(apiKey, apiSecret string) ([]response.Bin return res, nil } + +func (b *Binance) GetPrice(symbol string) (*response.BinanceApiTickerPriceResponse, error) { + return badapter.GetTickerPrice(symbol) +} diff --git a/pkg/service/binance/service.go b/pkg/service/binance/service.go index 62645331..91880007 100644 --- a/pkg/service/binance/service.go +++ b/pkg/service/binance/service.go @@ -18,4 +18,5 @@ type Service interface { GetFutureAccountBalance(apiKey, apiSecret string) ([]response.BinanceFutureAccountBalance, error) GetFutureAccount(apiKey, apiSecret string) (*response.BinanceFutureAccount, error) GetFutureAccountInfo(apiKey, apiSecret string) ([]response.BinanceFuturePositionInfo, error) + GetPrice(symbol string) (*response.BinanceApiTickerPriceResponse, error) }