Skip to content

Commit 2d91311

Browse files
authored
Merge pull request #2 from initia-labs/feat/oracle-price-aggregator
feat: implement price aggregation with geckoterminal
2 parents 443999b + 98c5428 commit 2d91311

File tree

6 files changed

+125
-223
lines changed

6 files changed

+125
-223
lines changed

cmd/constants/providers.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/skip-mev/connect/v2/providers/apis/defi/raydium"
1414
"github.com/skip-mev/connect/v2/providers/apis/defi/uniswapv3"
1515
"github.com/skip-mev/connect/v2/providers/apis/dydx"
16+
"github.com/skip-mev/connect/v2/providers/apis/geckoterminal"
1617
krakenapi "github.com/skip-mev/connect/v2/providers/apis/kraken"
1718
"github.com/skip-mev/connect/v2/providers/apis/marketmap"
1819
"github.com/skip-mev/connect/v2/providers/apis/polymarket"
@@ -77,6 +78,11 @@ var (
7778
API: coingecko.DefaultAPIConfig,
7879
Type: types.ConfigType,
7980
},
81+
{
82+
Name: geckoterminal.Name,
83+
API: geckoterminal.DefaultETHAPIConfig,
84+
Type: types.ConfigType,
85+
},
8086
{
8187
Name: coinmarketcap.Name,
8288
API: coinmarketcap.DefaultAPIConfig,

pkg/math/oracle/aggregator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ func (m *IndexPriceAggregator) CalculateAdjustedPrice(
211211
if err != nil {
212212
return nil, err
213213
}
214-
214+
215215
// Make sure that the price is adjusted by the market price.
216216
return new(big.Float).Mul(price, normalizeByIndexPrice), nil
217217
}

providers/apis/geckoterminal/api_handler.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,20 @@ func (h *APIHandler) CreateURL(
5252
tickers []types.ProviderTicker,
5353
) (string, error) {
5454
addresses := make([]string, len(tickers))
55+
var network string
5556
for i, ticker := range tickers {
5657
addresses[i] = ticker.GetOffChainTicker()
5758
h.cache.Add(ticker)
59+
60+
metaDataJSON := ticker.GetJSON()
61+
var metadata GeckoterminalMetadata
62+
if err := json.Unmarshal([]byte(metaDataJSON), &metadata); err != nil {
63+
return h.api.Endpoints[0].URL, fmt.Errorf("failed to parse metadata JSON: %w", err)
64+
}
65+
network = metadata.Network
5866
}
5967

60-
return fmt.Sprintf(h.api.Endpoints[0].URL, strings.Join(addresses, ",")), nil
68+
return fmt.Sprintf(h.api.Endpoints[0].URL, network, strings.Join(addresses, ",")), nil
6169
}
6270

6371
// ParseResponse parses the response from the GeckoTerminal API. The response is expected
@@ -67,7 +75,6 @@ func (h *APIHandler) ParseResponse(
6775
tickers []types.ProviderTicker,
6876
resp *http.Response,
6977
) types.PriceResponse {
70-
// Parse the response.
7178
var result GeckoTerminalResponse
7279
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
7380
return types.NewPriceResponseWithErr(
@@ -119,8 +126,7 @@ func (h *APIHandler) ParseResponse(
119126
resolved[ticker] = types.NewPriceResult(price, time.Now().UTC())
120127
}
121128

122-
// Add all expected tickers that did not return a response to the unresolved
123-
// map.
129+
// Add all expected tickers that did not return a response to the unresolved map
124130
for _, ticker := range tickers {
125131
_, resolvedOk := resolved[ticker]
126132
_, unresolvedOk := unresolved[ticker]

0 commit comments

Comments
 (0)