From e34ff9aaa08f45220276e9b849f5d2eab8c5be66 Mon Sep 17 00:00:00 2001
From: Sergey <83376337+freak12techno@users.noreply.github.com>
Date: Fri, 26 Jul 2024 16:10:45 +0300
Subject: [PATCH] feat: use denom exponent (#25)

---
 config.example.toml          | 8 ++++----
 pkg/config/denom_info.go     | 2 +-
 pkg/queriers/balance.go      | 3 ++-
 pkg/queriers/balance_test.go | 2 +-
 4 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/config.example.toml b/config.example.toml
index 35c1868..4c4cd3a 100644
--- a/config.example.toml
+++ b/config.example.toml
@@ -26,16 +26,16 @@ denoms = [
     # 1) denom - the base denom (like uatom for Cosmos Hub)
     # 2) display - denom - the denom name to display it (like atom for Cosmos Hub)
     # 3) coingecko-currency - a Coinecko API codename for a currency
-    # 4) denom-coefficient - the coefficient you need to multiply base denom to to get 1 token on Coingecko.
+    # 4) denom-exponent - the power of the coefficient you need to multiply base denom to get 1 token on Coingecko.
     # Example: on Cosmos network the base denom is uatom, 1 atom = 1_000_000 uatom
     # and 1 atom on Coingecko = $10, and your wallet has 10 atom, or 10_000_000 uatom.
     # Then you need to specify the following parameters:
     # coingecko-currency = "cosmos-hub"
     # base-denom = "uatom"
-    # denom-coefficient = 1000000
+    # denom-exponent = 6 # so the coefficient == 10^6 == 1_000_000
     # and after that, the /metrics endpoint will return your total balance as $100.
-    # Defaults to 1000000
-    { denom = "ubtsg", display-denom = "btsg", coingecko-currency = "bitsong", denom-coefficient = 1000000 }
+    # Defaults to 6
+    { denom = "ubtsg", display-denom = "btsg", coingecko-currency = "bitsong", denom-exponent = 6 }
 ]
 
 # Per-wallet config. You can specify multiple wallet configs per each chain.
diff --git a/pkg/config/denom_info.go b/pkg/config/denom_info.go
index 7176522..12daacb 100644
--- a/pkg/config/denom_info.go
+++ b/pkg/config/denom_info.go
@@ -3,7 +3,7 @@ package config
 type DenomInfo struct {
 	Denom             string `toml:"denom"`
 	DisplayDenom      string `toml:"display-denom"`
-	DenomCoefficient  int64  `default:"1000000"         toml:"denom-coefficient"`
+	DenomExponent     int    `default:"6"               toml:"denom-exponent"`
 	CoingeckoCurrency string `toml:"coingecko-currency"`
 }
 
diff --git a/pkg/queriers/balance.go b/pkg/queriers/balance.go
index 1bbb882..c6f770d 100644
--- a/pkg/queriers/balance.go
+++ b/pkg/queriers/balance.go
@@ -5,6 +5,7 @@ import (
 	"main/pkg/config"
 	"main/pkg/tendermint"
 	"main/pkg/types"
+	"math"
 	"sync"
 
 	"go.opentelemetry.io/otel/attribute"
@@ -93,7 +94,7 @@ func (q *BalanceQuerier) GetMetrics(ctx context.Context) ([]prometheus.Collector
 					denomInfo, found := chain.FindDenomByName(balance.Denom)
 					if found {
 						denom = denomInfo.GetName()
-						amount /= float64(denomInfo.DenomCoefficient)
+						amount /= math.Pow10(denomInfo.DenomExponent)
 					}
 
 					balancesGauge.With(prometheus.Labels{
diff --git a/pkg/queriers/balance_test.go b/pkg/queriers/balance_test.go
index a437887..adf1d67 100644
--- a/pkg/queriers/balance_test.go
+++ b/pkg/queriers/balance_test.go
@@ -63,7 +63,7 @@ func TestBalanceQuerierOk(t *testing.T) {
 			Name:    "name",
 			Group:   "group",
 		}},
-		Denoms: []configPkg.DenomInfo{{Denom: "uatom", DisplayDenom: "atom", DenomCoefficient: 1000000}},
+		Denoms: []configPkg.DenomInfo{{Denom: "uatom", DisplayDenom: "atom", DenomExponent: 6}},
 	}}}
 
 	tracer := tracing.InitNoopTracer()