Skip to content

Commit

Permalink
Merge tag 'v0.13.0' into mainnet-docker
Browse files Browse the repository at this point in the history
  • Loading branch information
tombeynon committed Jul 4, 2024
2 parents 173f345 + b7cfccd commit 718d26f
Show file tree
Hide file tree
Showing 25 changed files with 3,335 additions and 456 deletions.
11 changes: 11 additions & 0 deletions cmd/price-feeder.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cmd
import (
"bufio"
"context"
"database/sql"
"fmt"
"io"
"net/http"
Expand Down Expand Up @@ -253,6 +254,13 @@ func priceFeederCmdHandler(cmd *cobra.Command, args []string) error {
providerWeights[denom] = newWeight
}

volumeDatabase, err := sql.Open("sqlite3", cfg.HistoryDb)
if err != nil {
logger.Err(err).
Str("path", cfg.HistoryDb).
Msg("failed to open sqlite db")
}

oracle := oracle.New(
logger,
oracleClient,
Expand All @@ -268,6 +276,9 @@ func priceFeederCmdHandler(cmd *cobra.Command, args []string) error {
history,
cfg.ContractAdresses,
providerWeights,
cfg.Decimals,
cfg.Periods,
volumeDatabase,
)

telemetryCfg := telemetry.Config{}
Expand Down
18 changes: 17 additions & 1 deletion config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,29 +51,35 @@ var (
provider.ProviderCamelotV2: {},
provider.ProviderCamelotV3: {},
provider.ProviderCoinbase: {},
provider.ProviderCoinex: {},
provider.ProviderCrypto: {},
provider.ProviderCurve: {},
provider.ProviderDexter: {},
provider.ProviderFin: {},
provider.ProviderFinV2: {},
provider.ProviderGate: {},
provider.ProviderHelix: {},
provider.ProviderHitBtc: {},
provider.ProviderHuobi: {},
provider.ProviderIdxOsmosis: {},
provider.ProviderKraken: {},
provider.ProviderKucoin: {},
provider.ProviderLbank: {},
provider.ProviderMaya: {},
provider.ProviderMexc: {},
provider.ProviderMock: {},
provider.ProviderOkx: {},
provider.ProviderOsmosisV2: {},
provider.ProviderPancakeV3Bsc: {},
provider.ProviderPhemex: {},
provider.ProviderPionex: {},
provider.ProviderPoloniex: {},
provider.ProviderPyth: {},
provider.ProviderShade: {},
provider.ProviderStride: {},
provider.ProviderUniswapV3: {},
provider.ProviderUnstake: {},
provider.ProviderVelodromeV2: {},
provider.ProviderWhitewhaleCmdx: {},
provider.ProviderWhitewhaleHuahua: {},
provider.ProviderWhitewhaleInj: {},
Expand Down Expand Up @@ -117,6 +123,8 @@ type (
HeightPollInterval string `toml:"height_poll_interval"`
HistoryDb string `toml:"history_db"`
ContractAdresses map[string]map[string]string `toml:"contract_addresses"`
Decimals map[string]map[string]int `toml:"decimals"`
Periods map[string]map[string]int `toml:"periods"`
UrlSets map[string]UrlSet `toml:"url_set"`
}

Expand Down Expand Up @@ -219,7 +227,11 @@ type (
Websocket string `toml:"websocket"`
WebsocketPath string `toml:"websocket_path"`
PollInterval string `toml:"poll_interval"`
Contracts []string `toml:"contracts"`
// Contracts []string `toml:"contracts"`
VolumeBlocks int `toml:"volume_blocks"`
VolumePause int `toml:"volume_pause"`
Decimals map[string]int `toml:"decimals"`
Periods map[string]int
}

UrlSet struct {
Expand Down Expand Up @@ -289,6 +301,10 @@ func (p ProviderEndpoints) ToEndpoint(
Websocket: p.Websocket,
WebsocketPath: p.WebsocketPath,
PollInterval: pollInterval,
VolumeBlocks: p.VolumeBlocks,
VolumePause: p.VolumePause,
Decimals: p.Decimals,
Periods: p.Periods,
}
return e, nil
}
Expand Down
38 changes: 33 additions & 5 deletions oracle/oracle.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package oracle
import (
"context"
"crypto/rand"
"database/sql"
"encoding/hex"
"fmt"
"math"
Expand Down Expand Up @@ -81,6 +82,9 @@ type Oracle struct {
derivativeSymbols map[string]struct{}
contractAddresses map[string]map[string]string
providerWeights map[string]ProviderWeight
decimals map[string]map[string]int
periods map[string]map[string]int
volumeDatabase *sql.DB

mtx sync.RWMutex
lastPriceSyncTS time.Time
Expand All @@ -104,6 +108,9 @@ func New(
history history.PriceHistory,
contractAddresses map[string]map[string]string,
providerWeights map[string]ProviderWeight,
decimals map[string]map[string]int,
periods map[string]map[string]int,
volumeDatabase *sql.DB,
) *Oracle {
providerPairs := make(map[provider.Name][]types.CurrencyPair)
for _, pair := range currencyPairs {
Expand Down Expand Up @@ -147,6 +154,9 @@ func New(
history: history,
contractAddresses: contractAddresses,
providerWeights: providerWeights,
decimals: decimals,
periods: periods,
volumeDatabase: volumeDatabase,
}
}

Expand Down Expand Up @@ -225,10 +235,15 @@ func (o *Oracle) SetPrices(ctx context.Context) error {
priceProvider, found := o.priceProviders[providerName]
if !found {
endpoint := o.endpoints[providerName]
contractAddresses, _ := o.contractAddresses[providerName.String()]
contractAddresses := o.contractAddresses[providerName.String()]
decimals := o.decimals[providerName.String()]
periods := o.periods[providerName.String()]
endpoint.ContractAddresses = contractAddresses
endpoint.Decimals = decimals
endpoint.Periods = periods

newProvider, err := NewProvider(
o.volumeDatabase,
ctx,
providerName,
o.logger,
Expand Down Expand Up @@ -448,6 +463,7 @@ func (o *Oracle) GetParams(ctx context.Context) (oracletypes.Params, error) {
}

func NewProvider(
db *sql.DB,
ctx context.Context,
providerName provider.Name,
logger zerolog.Logger,
Expand Down Expand Up @@ -482,9 +498,11 @@ func NewProvider(
case provider.ProviderBybit:
return provider.NewBybitProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderCamelotV2, provider.ProviderCamelotV3:
return provider.NewCamelotProvider(ctx, providerLogger, endpoint, providerPairs...)
return provider.NewCamelotProvider(db, ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderCoinbase:
return provider.NewCoinbaseProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderCoinex:
return provider.NewCoinexProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderCrypto:
return provider.NewCryptoProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderCurve:
Expand All @@ -494,9 +512,11 @@ func NewProvider(
case provider.ProviderFin:
return provider.NewFinProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderFinV2:
return provider.NewFinV2Provider(ctx, providerLogger, endpoint, providerPairs...)
return provider.NewFinV2Provider(db, ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderGate:
return provider.NewGateProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderHelix:
return provider.NewHelixProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderHitBtc:
return provider.NewHitBtcProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderHuobi:
Expand All @@ -509,6 +529,8 @@ func NewProvider(
return provider.NewKucoinProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderLbank:
return provider.NewLbankProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderMaya:
return provider.NewMayaProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderMexc:
return provider.NewMexcProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderMock:
Expand All @@ -518,11 +540,13 @@ func NewProvider(
case provider.ProviderOsmosis:
return provider.NewOsmosisProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderOsmosisV2:
return provider.NewOsmosisV2Provider(ctx, providerLogger, endpoint, providerPairs...)
return provider.NewOsmosisV2Provider(db, ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderPancakeV3Bsc:
return provider.NewPancakeProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderPhemex:
return provider.NewPhemexProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderPionex:
return provider.NewPionexProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderPoloniex:
return provider.NewPoloniexProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderPyth:
Expand All @@ -531,6 +555,10 @@ func NewProvider(
return provider.NewShadeProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderUniswapV3:
return provider.NewUniswapV3Provider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderUnstake:
return provider.NewUnstakeProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderVelodromeV2:
return provider.NewVelodromeV2Provider(ctx, providerLogger, endpoint, providerPairs...)
case
provider.ProviderWhitewhaleCmdx,
provider.ProviderWhitewhaleHuahua,
Expand All @@ -540,7 +568,7 @@ func NewProvider(
provider.ProviderWhitewhaleLuna,
provider.ProviderWhitewhaleSei,
provider.ProviderWhitewhaleWhale:
return provider.NewWhitewhaleProvider(ctx, providerLogger, endpoint, providerPairs...)
return provider.NewWhitewhaleProvider(db, ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderXt:
return provider.NewXtProvider(ctx, providerLogger, endpoint, providerPairs...)
case provider.ProviderZero:
Expand Down
3 changes: 3 additions & 0 deletions oracle/oracle_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ func (ots *OracleTestSuite) SetupSuite() {
history,
nil,
nil,
nil,
nil,
nil,
)
}

Expand Down
69 changes: 50 additions & 19 deletions oracle/provider/bitmart.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,51 +59,82 @@ func NewBitmartProvider(
nil,
nil,
)

availablePairs, _ := provider.GetAvailablePairs()
provider.setPairs(pairs, availablePairs, currencyPairToBitmartSymbol)

go startPolling(provider, provider.endpoints.PollInterval, logger)
return provider, nil
}

func (p *BitmartProvider) Poll() error {
symbols := make(map[string]string, len(p.pairs))
for _, pair := range p.pairs {
symbols[pair.Join("_")] = pair.String()
func (p *BitmartProvider) getTickers() ([][]string, error) {
content, err := p.httpGet("/spot/quotation/v3/tickers")
if err != nil {
return nil, err
}

content, err := p.httpGet("/spot/v2/ticker")
var response struct {
Data [][]string `json:"data"`
}
err = json.Unmarshal(content, &response)
if err != nil {
return err
return nil, err
}

var tickersResponse BitmartTickersResponse
err = json.Unmarshal(content, &tickersResponse)
return response.Data, nil
}

func (p *BitmartProvider) Poll() error {
tickers, err := p.getTickers()
if err != nil {
return err
}

p.mtx.Lock()
defer p.mtx.Unlock()
now := time.Now()
for _, ticker := range tickers {
symbol := ticker[0]
price := strToDec(ticker[1])

for _, ticker := range tickersResponse.Data.Tickers {
symbol, ok := symbols[ticker.Symbol]
if !ok {
if !p.isPair(symbol) {
continue
}

p.tickers[symbol] = types.TickerPrice{
Price: strToDec(ticker.Price),
Volume: strToDec(ticker.Volume),
Time: time.UnixMilli(ticker.Time),
volume := strToDec(ticker[2])
_, found := p.inverse[symbol]
if found {
volume = strToDec(ticker[3])
if !volume.IsZero() {
volume = volume.Quo(price)
}
}

p.setTickerPrice(
symbol,
price,
volume,
now,
)
}
p.logger.Debug().Msg("updated tickers")
return nil
}

func (p *BitmartProvider) GetAvailablePairs() (map[string]struct{}, error) {
p.logger.Warn().Msg("available pairs query not implemented")
return nil, nil
tickers, err := p.getTickers()
if err != nil {
return nil, err
}

symbols := map[string]struct{}{}
for _, ticker := range tickers {
symbols[ticker[0]] = struct{}{}
}

return symbols, nil
}

func (p *BitmartProvider) SetPairs([]types.CurrencyPair) error {
return nil
func currencyPairToBitmartSymbol(pair types.CurrencyPair) string {
return pair.Join("_")
}
Loading

0 comments on commit 718d26f

Please sign in to comment.