Skip to content

Commit 37e0dbf

Browse files
committed
fix: show correct exchange rates for gnosis
See: BEDS-1124
1 parent ad733ae commit 37e0dbf

File tree

5 files changed

+23
-70
lines changed

5 files changed

+23
-70
lines changed

backend/cmd/notification_collector/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func Run() {
128128
}
129129

130130
log.Infof("initializing prices...")
131-
price.Init(utils.Config.Chain.ClConfig.DepositChainID, utils.Config.Eth1ErigonEndpoint, utils.Config.Frontend.ClCurrency, utils.Config.Frontend.ElCurrency)
131+
price.Init(utils.Config.Chain.ClConfig.DepositChainID, utils.Config.Eth1ErigonEndpoint, utils.Config.Frontend.MainCurrency, utils.Config.Frontend.ClCurrency, utils.Config.Frontend.ElCurrency)
132132
log.Infof("...prices initialized")
133133

134134
wg.Wait()

backend/cmd/statistics/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func Run() {
9999
log.Fatal(err, "error connecting to bigtable", 0)
100100
}
101101

102-
price.Init(utils.Config.Chain.ClConfig.DepositChainID, utils.Config.Eth1ErigonEndpoint, utils.Config.Frontend.ClCurrency, utils.Config.Frontend.ElCurrency)
102+
price.Init(utils.Config.Chain.ClConfig.DepositChainID, utils.Config.Eth1ErigonEndpoint, utils.Config.Frontend.MainCurrency, utils.Config.Frontend.ClCurrency, utils.Config.Frontend.ElCurrency)
103103

104104
if utils.Config.TieredCacheProvider != "redis" {
105105
log.Fatal(nil, "No cache provider set. Please set TierdCacheProvider (example redis)", 0)

backend/pkg/api/data_access/header.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,9 @@ func (d *DataAccessService) GetLatestBlockHeightsForEpoch(ctx context.Context, e
7272
func (d *DataAccessService) GetLatestExchangeRates(ctx context.Context) ([]t.EthConversionRate, error) {
7373
result := []t.EthConversionRate{}
7474

75-
availableCurrencies := price.GetAvailableCurrencies()
75+
availableCurrencies := utils.Deduplicate(price.GetAvailableCurrencies())
7676
for _, code := range availableCurrencies {
77-
if code == "ETH" {
78-
// Don't return ETH/ETH info
79-
continue
80-
}
81-
rate := price.GetPrice("ETH", code)
77+
rate := price.GetPrice(d.config.Frontend.MainCurrency, code)
8278
result = append(result, t.EthConversionRate{
8379
Currency: price.GetCurrencyLabel(code),
8480
Code: code,

backend/pkg/api/services/service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (s *Services) InitServices() {
4646
go s.startEmailSenderService(wg)
4747

4848
log.Infof("initializing prices...")
49-
price.Init(utils.Config.Chain.ClConfig.DepositChainID, utils.Config.Eth1ErigonEndpoint, utils.Config.Frontend.ClCurrency, utils.Config.Frontend.ElCurrency)
49+
price.Init(utils.Config.Chain.ClConfig.DepositChainID, utils.Config.Eth1ErigonEndpoint, utils.Config.Frontend.MainCurrency, utils.Config.Frontend.ClCurrency, utils.Config.Frontend.ElCurrency)
5050
log.Infof("...prices initialized")
5151

5252
wg.Wait()

backend/pkg/commons/price/price.go

Lines changed: 18 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ var prices = map[string]float64{}
2626
var pricesMu = &sync.Mutex{}
2727
var didInit = uint64(0)
2828
var feeds = map[string]*chainlink_feed.Feed{}
29-
var calcPairs = map[string]bool{}
30-
var clCurrency = "ETH"
31-
var elCurrency = "ETH"
29+
var mainCurrency = "ETH" // currency in which all exchange rates are denominated, e.g. ETH or GNO
30+
var clCurrency = "ETH" // currency in which all CL values are denominated, e.g. ETH or mGNO
31+
var elCurrency = "ETH" // currency in which all EL values are denominated, e.g. ETH or xDai
3232

3333
var currencies = map[string]struct {
3434
Symbol string
@@ -37,8 +37,7 @@ var currencies = map[string]struct {
3737
"AUD": {"A$", "Australian Dollar"},
3838
"CAD": {"C$", "Canadian Dollar"},
3939
"CNY": {"¥", "Chinese Yuan"},
40-
"DAI": {"DAI", "DAI stablecoin"},
41-
"xDAI": {"xDAI", "xDAI stablecoin"},
40+
"xDAI": {"DAI", "xDAI stablecoin"},
4241
"ETH": {"ETH", "Ether"},
4342
"EUR": {"€", "Euro"},
4443
"GBP": {"£", "Pound Sterling"},
@@ -52,7 +51,7 @@ func init() {
5251
runOnceWg.Add(1)
5352
}
5453

55-
func Init(chainId uint64, eth1Endpoint, clCurrencyParam, elCurrencyParam string) {
54+
func Init(chainId uint64, eth1Endpoint, mainCurrencyParam, clCurrencyParam, elCurrencyParam string) {
5655
if atomic.AddUint64(&didInit, 1) > 1 {
5756
log.Warnf("price.Init called multiple times")
5857
return
@@ -61,21 +60,17 @@ func Init(chainId uint64, eth1Endpoint, clCurrencyParam, elCurrencyParam string)
6160
switch chainId {
6261
case 1, 100:
6362
default:
64-
setPrice(elCurrency, elCurrency, 1)
65-
setPrice(clCurrency, clCurrency, 1)
63+
setPrice(mainCurrency, elCurrency, 1)
64+
setPrice(mainCurrency, clCurrency, 1)
6665
availableCurrencies = []string{clCurrency, elCurrency}
6766
log.Warnf("chainId not supported for fetching prices: %v", chainId)
6867
runOnce.Do(func() { runOnceWg.Done() })
6968
return
7069
}
7170

71+
mainCurrency = mainCurrencyParam
7272
clCurrency = clCurrencyParam
7373
elCurrency = elCurrencyParam
74-
if elCurrency == "xDAI" {
75-
elCurrency = "DAI"
76-
}
77-
calcPairs[elCurrency] = true
78-
calcPairs[clCurrency] = true
7974

8075
eClient, err := ethclient.Dial(eth1Endpoint)
8176
if err != nil {
@@ -104,34 +99,16 @@ func Init(chainId uint64, eth1Endpoint, clCurrencyParam, elCurrencyParam string)
10499
feedAddrs["JPY/USD"] = "0xbce206cae7f0ec07b545edde332a47c2f75bbeb3"
105100
feedAddrs["GBP/USD"] = "0x5c0ab2d9b5a7ed9f470386e82bb36a3613cdd4b5"
106101
feedAddrs["AUD/USD"] = "0x77f9710e7d0a19669a13c055f62cd80d313df022"
107-
108102
availableCurrencies = []string{"ETH", "USD", "EUR", "GBP", "CNY", "CAD", "AUD", "JPY"}
109-
case 11155111:
110-
// see: https://docs.chain.link/data-feeds/price-feeds/addresses/
111-
feedAddrs["ETH/USD"] = "0x694AA1769357215DE4FAC081bf1f309aDC325306"
112-
feedAddrs["EUR/USD"] = "0x1a81afB8146aeFfCFc5E50e8479e826E7D55b910"
113-
feedAddrs["JPY/USD"] = "0x8A6af2B75F23831ADc973ce6288e5329F63D86c6"
114-
feedAddrs["GBP/USD"] = "0x91FAB41F5f3bE955963a986366edAcff1aaeaa83"
115-
feedAddrs["AUD/USD"] = "0xB0C712f98daE15264c8E26132BCC91C40aD4d5F9"
116-
117-
availableCurrencies = []string{"ETH", "USD", "EUR", "GBP", "AUD", "JPY"}
118103
case 100:
119104
// see: https://docs.chain.link/data-feeds/price-feeds/addresses/?network=gnosis-chain
120105
feedAddrs["GNO/USD"] = "0x22441d81416430A54336aB28765abd31a792Ad37"
121-
feedAddrs["DAI/USD"] = "0x678df3415fc31947dA4324eC63212874be5a82f8"
106+
feedAddrs["xDAI/USD"] = "0x678df3415fc31947dA4324eC63212874be5a82f8"
122107
feedAddrs["EUR/USD"] = "0xab70BCB260073d036d1660201e9d5405F5829b7a"
123108
feedAddrs["JPY/USD"] = "0x2AfB993C670C01e9dA1550c58e8039C1D8b8A317"
124-
// feedAddrs["CHFUSD"] = "0xFb00261Af80ADb1629D3869E377ae1EEC7bE659F"
125109
feedAddrs["ETH/USD"] = "0xa767f745331D267c7751297D982b050c93985627"
126-
127-
setPrice("mGNO", "GNO", float64(1)/float64(32))
128110
setPrice("GNO", "mGNO", 32)
129-
setPrice("mGNO", "mGNO", 1)
130-
setPrice("GNO", "GNO", 1)
131-
132-
calcPairs["GNO"] = true
133-
134-
availableCurrencies = []string{"GNO", "mGNO", "DAI", "ETH", "USD", "EUR", "JPY"}
111+
availableCurrencies = []string{"GNO", "mGNO", "xDAI", "ETH", "USD", "EUR", "JPY"}
135112
default:
136113
log.Fatal(fmt.Errorf("unsupported chainId %v", chainId), "", 0)
137114
}
@@ -166,9 +143,6 @@ func updatePrices() {
166143
pricesMu.Lock()
167144
defer pricesMu.Unlock()
168145
prices[pair] = price
169-
if pair == "GNO/USD" {
170-
prices["mGNO/USD"] = price / 32
171-
}
172146
return nil
173147
})
174148
}
@@ -177,35 +151,24 @@ func updatePrices() {
177151
log.Error(err, "error upating prices", 0)
178152
return
179153
}
180-
for p := range calcPairs {
181-
if err = calcPricePairs(p); err != nil {
182-
log.Error(err, "error calculating price pairs", 0, map[string]interface{}{"pair": p})
183-
return
184-
}
185-
}
186-
setPrice(elCurrency, elCurrency, 1)
187-
setPrice(clCurrency, clCurrency, 1)
188154

189-
runOnce.Do(func() { runOnceWg.Done() })
190-
}
191-
192-
func calcPricePairs(currency string) error {
155+
// add prices of main currency to all other currencies
193156
pricesMu.Lock()
194157
defer pricesMu.Unlock()
195-
pricesCopy := prices
196-
currencyUsdPrice, exists := prices[currency+"/USD"]
158+
currencyUsdPrice, exists := prices[mainCurrency+"/USD"]
197159
if !exists {
198-
return fmt.Errorf("failed updating prices: cant find %v pair %+v", currency+"/USD", prices)
160+
log.Error(fmt.Errorf("failed updating prices: cant find %v pair %+v", mainCurrency+"/USD", prices), "", 0)
161+
return
199162
}
200-
for pair, price := range pricesCopy {
163+
for pair, price := range prices {
201164
s := strings.Split(pair, "/")
202165
if len(s) < 2 || s[1] != "USD" {
203166
continue
204167
}
205-
// availableCurrencies = append(availableCurrencies, s[0])
206-
prices[currency+"/"+s[0]] = currencyUsdPrice / price
168+
prices[mainCurrency+"/"+s[0]] = currencyUsdPrice / price
207169
}
208-
return nil
170+
171+
runOnce.Do(func() { runOnceWg.Done() })
209172
}
210173

211174
func setPrice(a, b string, v float64) {
@@ -221,12 +184,6 @@ func GetPrice(a, b string) float64 {
221184
runOnceWg.Wait()
222185
pricesMu.Lock()
223186
defer pricesMu.Unlock()
224-
if a == "xDAI" {
225-
a = "DAI"
226-
}
227-
if b == "xDAI" {
228-
b = "DAI"
229-
}
230187
price, exists := prices[a+"/"+b]
231188
if !exists {
232189
log.WarnWithFields(log.Fields{"pair": a + "/" + b}, "price pair not found")

0 commit comments

Comments
 (0)