@@ -26,9 +26,9 @@ var prices = map[string]float64{}
2626var pricesMu = & sync.Mutex {}
2727var didInit = uint64 (0 )
2828var 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
3333var 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
211174func 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