diff --git a/protocol/app/app.go b/protocol/app/app.go index ae84165c57..8bf9853bb9 100644 --- a/protocol/app/app.go +++ b/protocol/app/app.go @@ -89,10 +89,10 @@ import ( "github.com/cosmos/ibc-go/modules/capability" capabilitykeeper "github.com/cosmos/ibc-go/modules/capability/keeper" capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" - "github.com/dydxprotocol/v4-chain/protocol/daemons/configs" "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" + "go.uber.org/zap" "google.golang.org/grpc" // App @@ -103,6 +103,7 @@ import ( "github.com/dydxprotocol/v4-chain/protocol/app/prepare/prices" "github.com/dydxprotocol/v4-chain/protocol/app/process" + "github.com/dydxprotocol/v4-chain/protocol/app/vote_extensions" "github.com/dydxprotocol/v4-chain/protocol/lib" "github.com/dydxprotocol/v4-chain/protocol/lib/metrics" timelib "github.com/dydxprotocol/v4-chain/protocol/lib/time" @@ -113,6 +114,7 @@ import ( // Daemons bridgeclient "github.com/dydxprotocol/v4-chain/protocol/daemons/bridge/client" + "github.com/dydxprotocol/v4-chain/protocol/daemons/configs" daemonflags "github.com/dydxprotocol/v4-chain/protocol/daemons/flags" liquidationclient "github.com/dydxprotocol/v4-chain/protocol/daemons/liquidation/client" metricsclient "github.com/dydxprotocol/v4-chain/protocol/daemons/metrics/client" @@ -205,9 +207,16 @@ import ( "github.com/dydxprotocol/v4-chain/protocol/indexer/msgsender" // Slinky + slinkyproposals "github.com/skip-mev/slinky/abci/proposals" + "github.com/skip-mev/slinky/abci/strategies/aggregator" + compression "github.com/skip-mev/slinky/abci/strategies/codec" + "github.com/skip-mev/slinky/abci/strategies/currencypair" + "github.com/skip-mev/slinky/abci/ve" oracleconfig "github.com/skip-mev/slinky/oracle/config" + "github.com/skip-mev/slinky/pkg/math/voteweighted" oracleclient "github.com/skip-mev/slinky/service/clients/oracle" servicemetrics "github.com/skip-mev/slinky/service/metrics" + promserver "github.com/skip-mev/slinky/service/servers/prometheus" // Grpc Streaming streaming "github.com/dydxprotocol/v4-chain/protocol/streaming/grpc" @@ -327,11 +336,13 @@ type App struct { PriceFeedClient *pricefeedclient.Client LiquidationsClient *liquidationclient.Client BridgeClient *bridgeclient.Client + SlinkyClient *slinkyclient.Client DaemonHealthMonitor *daemonservertypes.HealthMonitor // Slinky - SlinkyClient *slinkyclient.Client + oraclePrometheusServer *promserver.PrometheusServer + oracleMetrics servicemetrics.Metrics } // assertAppPreconditions assert invariants required for an application to start. @@ -448,6 +459,7 @@ func New( return nil }, ) + app.initOracleMetrics(appOpts) app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) @@ -1359,51 +1371,10 @@ func New( app.SetPrecommiter(app.Precommitter) app.SetPrepareCheckStater(app.PrepareCheckStater) - // PrepareProposal setup. - priceUpdateGenerator := prices.NewDefaultPriceUpdateGenerator(app.PricesKeeper) - if appFlags.NonValidatingFullNode { - app.SetPrepareProposal(prepare.FullNodePrepareProposalHandler()) - } else { - app.SetPrepareProposal( - prepare.PrepareProposalHandler( - txConfig, - app.BridgeKeeper, - app.ClobKeeper, - app.PerpetualsKeeper, - priceUpdateGenerator, - ), - ) - } - - // ProcessProposal setup. - priceUpdateDecoder := process.NewDefaultUpdateMarketPriceTxDecoder(app.PricesKeeper, app.txConfig.TxDecoder()) - if appFlags.NonValidatingFullNode { - // Note: If the command-line flag `--non-validating-full-node` is enabled, this node will use - // an implementation of `ProcessProposal` which always returns `abci.ResponseProcessProposal_ACCEPT`. - // Full-nodes do not participate in consensus, and therefore should not participate in voting / `ProcessProposal`. - app.SetProcessProposal( - process.FullNodeProcessProposalHandler( - txConfig, - app.BridgeKeeper, - app.ClobKeeper, - app.StakingKeeper, - app.PerpetualsKeeper, - priceUpdateDecoder, - ), - ) - } else { - app.SetProcessProposal( - process.ProcessProposalHandler( - txConfig, - app.BridgeKeeper, - app.ClobKeeper, - app.StakingKeeper, - app.PerpetualsKeeper, - app.PricesKeeper, - priceUpdateDecoder, - ), - ) - } + // ProposalHandler setup. + prepareProposalHandler, processProposalHandler := app.createProposalHandlers(appFlags, txConfig, appOpts) + app.SetPrepareProposal(prepareProposalHandler) + app.SetProcessProposal(processProposalHandler) // Note that panics from out of gas errors won't get logged, since the `OutOfGasMiddleware` is added in front of this, // so error will get handled by that middleware and subsequent middlewares won't get executed. @@ -1454,20 +1425,15 @@ func New( } func (app *App) initSlinkySidecarClient(appOpts servertypes.AppOptions) oracleclient.OracleClient { - // Slinky setup + // Create the oracle service. cfg, err := oracleconfig.ReadConfigFromAppOpts(appOpts) if err != nil { panic(err) } - oracleMetrics, err := servicemetrics.NewMetricsFromConfig(cfg, app.ChainID()) - if err != nil { - panic(err) - } - // Create the oracle service. slinkyClient, err := oracleclient.NewClientFromConfig( cfg, app.Logger().With("client", "oracle"), - oracleMetrics, + app.oracleMetrics, ) if err != nil { panic(err) @@ -1475,6 +1441,152 @@ func (app *App) initSlinkySidecarClient(appOpts servertypes.AppOptions) oraclecl return slinkyClient } +func (app *App) createProposalHandlers( + appFlags flags.Flags, + txConfig client.TxConfig, + appOpts servertypes.AppOptions, +) (sdk.PrepareProposalHandler, sdk.ProcessProposalHandler) { + var priceUpdateDecoder process.UpdateMarketPriceTxDecoder = process.NewDefaultUpdateMarketPriceTxDecoder( + app.PricesKeeper, app.txConfig.TxDecoder()) + // If the node is a NonValidatingFullNode, we don't need to run any oracle code + // Note: If the command-line flag `--non-validating-full-node` is enabled, this node will use + // an implementation of `ProcessProposal` which always returns `abci.ResponseProcessProposal_ACCEPT`. + // Full-nodes do not participate in consensus, and therefore should not participate in voting / `ProcessProposal`. + if appFlags.NonValidatingFullNode { + if app.oracleMetrics == nil { + app.oracleMetrics = servicemetrics.NewNopMetrics() + } + return prepare.FullNodePrepareProposalHandler(), process.FullNodeProcessProposalHandler( + txConfig, + app.BridgeKeeper, + app.ClobKeeper, + app.StakingKeeper, + app.PerpetualsKeeper, + priceUpdateDecoder, + ) + } + strategy := currencypair.NewDefaultCurrencyPairStrategy(app.PricesKeeper) + var priceUpdateGenerator prices.PriceUpdateGenerator = prices.NewDefaultPriceUpdateGenerator(app.PricesKeeper) + + veCodec := compression.NewCompressionVoteExtensionCodec( + compression.NewDefaultVoteExtensionCodec(), + compression.NewZLibCompressor(), + ) + extCommitCodec := compression.NewCompressionExtendedCommitCodec( + compression.NewDefaultExtendedCommitCodec(), + compression.NewZLibCompressor(), + ) + + // Set Price Update Generators/Decoders for Slinky + if appFlags.VEOracleEnabled { + priceUpdateGenerator = prices.NewSlinkyPriceUpdateGenerator( + aggregator.NewDefaultVoteAggregator( + app.Logger(), + voteweighted.MedianFromContext( + app.Logger(), + app.StakingKeeper, + voteweighted.DefaultPowerThreshold, + ), + strategy, + ), + extCommitCodec, + veCodec, + strategy, + ) + priceUpdateDecoder = process.NewSlinkyMarketPriceDecoder( + priceUpdateDecoder, + priceUpdateGenerator, + ) + } + // Generate the dydx handlers + dydxPrepareProposalHandler := prepare.PrepareProposalHandler( + txConfig, + app.BridgeKeeper, + app.ClobKeeper, + app.PerpetualsKeeper, + priceUpdateGenerator, + ) + + // ProcessProposal setup. + var dydxProcessProposalHandler = process.ProcessProposalHandler( + txConfig, + app.BridgeKeeper, + app.ClobKeeper, + app.StakingKeeper, + app.PerpetualsKeeper, + app.PricesKeeper, + priceUpdateDecoder, + ) + + // Wrap dydx handlers with slinky handlers + if appFlags.VEOracleEnabled { + app.initOracle(priceUpdateDecoder) + proposalHandler := slinkyproposals.NewProposalHandler( + app.Logger(), + dydxPrepareProposalHandler, + dydxProcessProposalHandler, + ve.NewDefaultValidateVoteExtensionsFn(app.ChainID(), app.StakingKeeper), + veCodec, + extCommitCodec, + strategy, + app.oracleMetrics, + slinkyproposals.RetainOracleDataInWrappedProposalHandler(), + ) + return proposalHandler.PrepareProposalHandler(), proposalHandler.ProcessProposalHandler() + } + return dydxPrepareProposalHandler, dydxProcessProposalHandler +} + +func (app *App) initOracle(pricesTxDecoder process.UpdateMarketPriceTxDecoder) { + // Vote Extension setup. + slinkyVoteExtensionsHandler := ve.NewVoteExtensionHandler( + app.Logger(), + vote_extensions.NewOraclePrices(app.PricesKeeper), + time.Second, + currencypair.NewDefaultCurrencyPairStrategy(app.PricesKeeper), + compression.NewCompressionVoteExtensionCodec( + compression.NewDefaultVoteExtensionCodec(), + compression.NewZLibCompressor(), + ), + app.PreBlocker, + app.oracleMetrics, + ) + + dydxExtendVoteHandler := vote_extensions.ExtendVoteHandler{ + SlinkyExtendVoteHandler: slinkyVoteExtensionsHandler.ExtendVoteHandler(), + PricesTxDecoder: pricesTxDecoder, + PricesKeeper: app.PricesKeeper, + } + + app.SetExtendVoteHandler(dydxExtendVoteHandler.ExtendVoteHandler()) + app.SetVerifyVoteExtensionHandler(slinkyVoteExtensionsHandler.VerifyVoteExtensionHandler()) +} + +func (app *App) initOracleMetrics(appOpts servertypes.AppOptions) { + cfg, err := oracleconfig.ReadConfigFromAppOpts(appOpts) + if err != nil { + panic(err) + } + oracleMetrics, err := servicemetrics.NewMetricsFromConfig(cfg, app.ChainID()) + if err != nil { + panic(err) + } + // run prometheus metrics + if cfg.MetricsEnabled { + promLogger, err := zap.NewProduction() + if err != nil { + panic(err) + } + app.oraclePrometheusServer, err = promserver.NewPrometheusServer(cfg.PrometheusServerAddress, promLogger) + if err != nil { + panic(err) + } + // start the prometheus server + go app.oraclePrometheusServer.Start() + } + app.oracleMetrics = oracleMetrics +} + // RegisterDaemonWithHealthMonitor registers a daemon service with the update monitor, which will commence monitoring // the health of the daemon. If the daemon does not register, the method will panic. func (app *App) RegisterDaemonWithHealthMonitor( @@ -1749,6 +1861,9 @@ func (app *App) setAnteHandler(txConfig client.TxConfig) { // Close invokes an ordered shutdown of routines. func (app *App) Close() error { app.BaseApp.Close() + if app.oraclePrometheusServer != nil { + app.oraclePrometheusServer.Close() + } return app.closeOnce() } diff --git a/protocol/app/app_test.go b/protocol/app/app_test.go index 1a55241e79..44748c78b5 100644 --- a/protocol/app/app_test.go +++ b/protocol/app/app_test.go @@ -106,6 +106,7 @@ func TestAppIsFullyInitialized(t *testing.T) { "LiquidationsClient", "BridgeClient", "SlinkyClient", + "oraclePrometheusServer", // Any default constructed type can be considered initialized if the default is what is // expected. getUninitializedStructFields relies on fields being the non-default and diff --git a/protocol/app/flags/flags.go b/protocol/app/flags/flags.go index 18fa78a19b..0be74ac6d8 100644 --- a/protocol/app/flags/flags.go +++ b/protocol/app/flags/flags.go @@ -22,6 +22,7 @@ type Flags struct { // Grpc Streaming GrpcStreamingEnabled bool + VEOracleEnabled bool // Slinky Vote Extensions } // List of CLI flags. @@ -37,6 +38,9 @@ const ( // Grpc Streaming GrpcStreamingEnabled = "grpc-streaming-enabled" + + // Slinky VEs enabled + VEOracleEnabled = "slinky-vote-extension-oracle-enabled" ) // Default values. @@ -47,6 +51,7 @@ const ( DefaultDdErrorTrackingFormat = false DefaultGrpcStreamingEnabled = false + DefaultVEOracleEnabled = true ) // AddFlagsToCmd adds flags to app initialization. @@ -80,6 +85,11 @@ func AddFlagsToCmd(cmd *cobra.Command) { DefaultGrpcStreamingEnabled, "Whether to enable grpc streaming for full nodes", ) + cmd.Flags().Bool( + VEOracleEnabled, + DefaultVEOracleEnabled, + "Whether to run on-chain oracle via slinky vote extensions", + ) } // Validate checks that the flags are valid. @@ -119,6 +129,7 @@ func GetFlagValuesFromOptions( GrpcEnable: true, GrpcStreamingEnabled: DefaultGrpcStreamingEnabled, + VEOracleEnabled: true, } // Populate the flags if they exist. @@ -164,5 +175,11 @@ func GetFlagValuesFromOptions( } } + if option := appOpts.Get(VEOracleEnabled); option != nil { + if v, err := cast.ToBoolE(option); err == nil { + result.VEOracleEnabled = v + } + } + return result } diff --git a/protocol/app/prepare/full_node_prepare_proposal.go b/protocol/app/prepare/full_node_prepare_proposal.go index 34fb8d6107..a394ffdcfc 100644 --- a/protocol/app/prepare/full_node_prepare_proposal.go +++ b/protocol/app/prepare/full_node_prepare_proposal.go @@ -20,6 +20,6 @@ func FullNodePrepareProposalHandler() sdk.PrepareProposalHandler { recordErrorMetricsWithLabel(metrics.PrepareProposalTxs) // Return an empty response if the node is running in full-node mode so that the proposal fails. - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } } diff --git a/protocol/app/prepare/prepare_proposal.go b/protocol/app/prepare/prepare_proposal.go index 1cfee4f26f..ad7d3b3e59 100644 --- a/protocol/app/prepare/prepare_proposal.go +++ b/protocol/app/prepare/prepare_proposal.go @@ -2,7 +2,6 @@ package prepare import ( "fmt" - "github.com/dydxprotocol/v4-chain/protocol/app/constants" "time" abci "github.com/cometbft/cometbft/abci/types" @@ -11,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/dydxprotocol/v4-chain/protocol/app/constants" "github.com/dydxprotocol/v4-chain/protocol/app/prepare/prices" "github.com/dydxprotocol/v4-chain/protocol/lib/metrics" pricetypes "github.com/dydxprotocol/v4-chain/protocol/x/prices/types" @@ -94,33 +94,33 @@ func PrepareProposalHandler( if err != nil { ctx.Logger().Error(fmt.Sprintf("GetUpdateMarketPricesTx error: %v", err)) recordErrorMetricsWithLabel(metrics.PricesTx) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } err = txs.SetUpdateMarketPricesTx(pricesTxResp.Tx) if err != nil { ctx.Logger().Error(fmt.Sprintf("SetUpdateMarketPricesTx error: %v", err)) recordErrorMetricsWithLabel(metrics.PricesTx) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } fundingTxResp, err := GetAddPremiumVotesTx(ctx, txConfig, perpetualKeeper) if err != nil { ctx.Logger().Error(fmt.Sprintf("GetAddPremiumVotesTx error: %v", err)) recordErrorMetricsWithLabel(metrics.FundingTx) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } err = txs.SetAddPremiumVotesTx(fundingTxResp.Tx) if err != nil { ctx.Logger().Error(fmt.Sprintf("SetAddPremiumVotesTx error: %v", err)) recordErrorMetricsWithLabel(metrics.FundingTx) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } acknowledgeBridgesTxResp, err := GetAcknowledgeBridgesTx(ctx, txConfig, bridgeKeeper) if err != nil { ctx.Logger().Error(fmt.Sprintf("GetAcknowledgeBridgesTx error: %v", err)) recordErrorMetricsWithLabel(metrics.AcknowledgeBridgesTx) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } // Set AcknowledgeBridgesTx whether there are bridge events or not to ensure // consistent ordering of txs received by ProcessProposal. @@ -128,7 +128,7 @@ func PrepareProposalHandler( if err != nil { ctx.Logger().Error(fmt.Sprintf("SetAcknowledgeBridgesTx error: %v", err)) recordErrorMetricsWithLabel(metrics.AcknowledgeBridgesTx) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } // Gather "Other" group messages. @@ -141,7 +141,7 @@ func PrepareProposalHandler( if err != nil { ctx.Logger().Error(fmt.Sprintf("AddOtherTxs error: %v", err)) recordErrorMetricsWithLabel(metrics.OtherTxs) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } } @@ -151,13 +151,13 @@ func PrepareProposalHandler( if err != nil { ctx.Logger().Error(fmt.Sprintf("GetProposedOperationsTx error: %v", err)) recordErrorMetricsWithLabel(metrics.OperationsTx) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } err = txs.SetProposedOperationsTx(operationsTxResp.Tx) if err != nil { ctx.Logger().Error(fmt.Sprintf("SetProposedOperationsTx error: %v", err)) recordErrorMetricsWithLabel(metrics.OperationsTx) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } // Try to pack in more "Other" txs. @@ -169,7 +169,7 @@ func PrepareProposalHandler( if err != nil { ctx.Logger().Error(fmt.Sprintf("AddOtherTxs (additional) error: %v", err)) recordErrorMetricsWithLabel(metrics.OtherTxs) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } } } @@ -178,7 +178,7 @@ func PrepareProposalHandler( if err != nil { ctx.Logger().Error(fmt.Sprintf("GetTxsInOrder error: %v", err)) recordErrorMetricsWithLabel(metrics.GetTxsInOrder) - return &EmptyResponse, nil + return &abci.ResponsePrepareProposal{Txs: [][]byte{}}, nil } // Record a success metric. diff --git a/protocol/app/process/slinky_market_price_decoder.go b/protocol/app/process/slinky_market_price_decoder.go index 5db35b7446..ab914f5de5 100644 --- a/protocol/app/process/slinky_market_price_decoder.go +++ b/protocol/app/process/slinky_market_price_decoder.go @@ -2,11 +2,13 @@ package process import ( "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/skip-mev/slinky/abci/ve" + "github.com/dydxprotocol/v4-chain/protocol/app/constants" "github.com/dydxprotocol/v4-chain/protocol/app/prepare/prices" pricestypes "github.com/dydxprotocol/v4-chain/protocol/x/prices/types" - "github.com/skip-mev/slinky/abci/ve" ) // SlinkyMarketPriceDecoder wraps an existing MarketPriceDecoder with logic to verify that the MarketPriceUpdateTx diff --git a/protocol/app/process/slinky_market_price_decoder_test.go b/protocol/app/process/slinky_market_price_decoder_test.go index 3fbd9a8587..6880737cce 100644 --- a/protocol/app/process/slinky_market_price_decoder_test.go +++ b/protocol/app/process/slinky_market_price_decoder_test.go @@ -5,12 +5,13 @@ import ( "testing" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/skip-mev/slinky/abci/testutils" + "github.com/stretchr/testify/suite" + "github.com/dydxprotocol/v4-chain/protocol/app/constants" "github.com/dydxprotocol/v4-chain/protocol/app/process" "github.com/dydxprotocol/v4-chain/protocol/mocks" pricestypes "github.com/dydxprotocol/v4-chain/protocol/x/prices/types" - "github.com/skip-mev/slinky/abci/testutils" - "github.com/stretchr/testify/suite" ) type SlinkyMarketPriceDecoderSuite struct { diff --git a/protocol/cmd/dydxprotocold/cmd/config.go b/protocol/cmd/dydxprotocold/cmd/config.go index 4124544c1b..422b37a9c6 100644 --- a/protocol/cmd/dydxprotocold/cmd/config.go +++ b/protocol/cmd/dydxprotocold/cmd/config.go @@ -54,6 +54,13 @@ func initAppConfig() (string, *DydxAppConfig) { appConfig := DydxAppConfig{ Config: *srvCfg, + Oracle: oracleconfig.AppConfig{ + Enabled: true, + OracleAddress: "localhost:8080", + ClientTimeout: time.Second * 2, + MetricsEnabled: false, + PrometheusServerAddress: "", + }, } // Enable telemetry. diff --git a/protocol/daemons/flags/flags.go b/protocol/daemons/flags/flags.go index 99dd8f804c..50ba9c4ea7 100644 --- a/protocol/daemons/flags/flags.go +++ b/protocol/daemons/flags/flags.go @@ -107,15 +107,16 @@ func GetDefaultDaemonFlags() DaemonFlags { QueryPageLimit: 1_000, }, Price: PriceFlags{ - Enabled: true, + Enabled: false, LoopDelayMs: 3_000, }, Slinky: SlinkyFlags{ AppConfig: oracleconfig.AppConfig{ + Enabled: true, OracleAddress: "localhost:8080", ClientTimeout: time.Second * 2, - MetricsEnabled: false, - PrometheusServerAddress: "", + MetricsEnabled: true, + PrometheusServerAddress: "0.0.0.0:8001", }, }, } diff --git a/protocol/daemons/slinky/config/market.json b/protocol/daemons/slinky/config/market.json index d4433a03a2..82e9654b73 100644 --- a/protocol/daemons/slinky/config/market.json +++ b/protocol/daemons/slinky/config/market.json @@ -424,6 +424,14 @@ "decimals": 8, "min_provider_count": 1 }, + "MOG/USD": { + "currency_pair": { + "Base": "MOG", + "Quote": "USD" + }, + "decimals": 18, + "min_provider_count": 1 + }, "NEAR/USD": { "currency_pair": { "Base": "NEAR", @@ -694,19 +702,23 @@ "ADA/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "ADA-USD" + "name": "KrakenAPI", + "off_chain_ticker": "ADAUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "ADA/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "ADA-USD" }, { - "name": "kraken", - "off_chain_ticker": "ADA/USD" + "name": "CoinbasePro", + "off_chain_ticker": "ADA-USD" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "ADA-USD" } ] @@ -714,15 +726,15 @@ "ADA/USDC": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "ADA-USDC" + "name": "Mexc", + "off_chain_ticker": "ADAUSDC" }, { - "name": "mexc", - "off_chain_ticker": "ADAUSDC" + "name": "Kucoin", + "off_chain_ticker": "ADA-USDC" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "ADA-USDC" } ] @@ -730,63 +742,67 @@ "ADA/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "ADA-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "ADAUSDT" }, { - "name": "mexc", - "off_chain_ticker": "ADAUSDT" + "name": "Gate", + "off_chain_ticker": "ADA_USDT" }, { - "name": "bybit", - "off_chain_ticker": "ADAUSDT" + "name": "Huobi", + "off_chain_ticker": "adausdt" }, { - "name": "gate.io", - "off_chain_ticker": "ADA_USDT" + "name": "Mexc", + "off_chain_ticker": "ADAUSDT" }, { - "name": "huobi", - "off_chain_ticker": "adausdt" + "name": "Binance", + "off_chain_ticker": "ADAUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "ADA-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "ADAUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "ADA-USDT" } ] }, "APE/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "APE-USD" + "name": "Kraken", + "off_chain_ticker": "APE/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "APE-USD" }, { - "name": "kraken", - "off_chain_ticker": "APE/USD" + "name": "CoinbasePro", + "off_chain_ticker": "APE-USD" } ] }, "APE/USDC": { "providers": [ { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "APE-USDC" }, { - "name": "coinbase", + "name": "Kucoin", "off_chain_ticker": "APE-USDC" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "APE-USDC" } ] @@ -794,43 +810,51 @@ "APE/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "APE-USDT" - }, - { - "name": "mexc", + "name": "KrakenAPI", "off_chain_ticker": "APEUSDT" }, { - "name": "coinbase_websocket", + "name": "CoinbaseProAPI", "off_chain_ticker": "APE-USDT" }, { - "name": "gate.io", + "name": "Gate", "off_chain_ticker": "APE_USDT" }, { - "name": "coinbase", + "name": "Mexc", + "off_chain_ticker": "APEUSDT" + }, + { + "name": "Binance", + "off_chain_ticker": "APEUSDT" + }, + { + "name": "Kucoin", "off_chain_ticker": "APE-USDT" }, { - "name": "okx", + "name": "CoinbasePro", "off_chain_ticker": "APE-USDT" }, { - "name": "binance", - "off_chain_ticker": "APEUSDT" + "name": "Okx", + "off_chain_ticker": "APE-USDT" } ] }, "APT/USD": { "providers": [ { - "name": "coinbase_websocket", + "name": "KrakenAPI", + "off_chain_ticker": "APTUSD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "APT-USD" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "APT-USD" } ] @@ -838,7 +862,7 @@ "APT/USDC": { "providers": [ { - "name": "okx", + "name": "Okx", "off_chain_ticker": "APT-USDC" } ] @@ -846,43 +870,47 @@ "APT/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "APT-USDT" + "name": "Gate", + "off_chain_ticker": "APT_USDT" }, { - "name": "mexc", - "off_chain_ticker": "APTUSDT" + "name": "Huobi", + "off_chain_ticker": "aptusdt" }, { - "name": "bybit", + "name": "Mexc", "off_chain_ticker": "APTUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "APT_USDT" - }, - { - "name": "huobi", - "off_chain_ticker": "aptusdt" + "name": "Binance", + "off_chain_ticker": "APTUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "APT-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "APTUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "APT-USDT" } ] }, "ARB/USD": { "providers": [ { - "name": "coinbase_websocket", + "name": "KrakenAPI", + "off_chain_ticker": "ARBUSD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "ARB-USD" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "ARB-USD" } ] @@ -890,59 +918,63 @@ "ARB/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "ARB-USDT" + "name": "Gate", + "off_chain_ticker": "ARB_USDT" }, { - "name": "mexc", - "off_chain_ticker": "ARBUSDT" + "name": "Huobi", + "off_chain_ticker": "arbusdt" }, { - "name": "bybit", + "name": "Mexc", "off_chain_ticker": "ARBUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "ARB_USDT" - }, - { - "name": "huobi", - "off_chain_ticker": "arbusdt" + "name": "Binance", + "off_chain_ticker": "ARBUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "ARB-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "ARBUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "ARB-USDT" } ] }, "ATOM/USD": { "providers": [ { - "name": "coingecko", + "name": "Coingecko", "off_chain_ticker": "cosmos/usd" }, { - "name": "coinbase_websocket", - "off_chain_ticker": "ATOM-USD" + "name": "KrakenAPI", + "off_chain_ticker": "ATOMUSD" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "ATOMUSD-PERP" + "name": "Kraken", + "off_chain_ticker": "ATOM/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "ATOM-USD" }, { - "name": "kraken", - "off_chain_ticker": "ATOM/USD" + "name": "CoinbasePro", + "off_chain_ticker": "ATOM-USD" + }, + { + "name": "CryptoCom", + "off_chain_ticker": "ATOMUSD-PERP" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "ATOM-USD" } ] @@ -950,19 +982,19 @@ "ATOM/USDC": { "providers": [ { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "ATOM-USDC" }, { - "name": "mexc", + "name": "Mexc", "off_chain_ticker": "ATOMUSDC" }, { - "name": "coinbase", + "name": "Kucoin", "off_chain_ticker": "ATOM-USDC" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "ATOM-USDC" } ] @@ -970,71 +1002,79 @@ "ATOM/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "ATOM-USDT" - }, - { - "name": "mexc", + "name": "KrakenAPI", "off_chain_ticker": "ATOMUSDT" }, { - "name": "coinbase_websocket", + "name": "CoinbaseProAPI", "off_chain_ticker": "ATOM-USDT" }, { - "name": "bybit", - "off_chain_ticker": "ATOMUSDT" + "name": "Gate", + "off_chain_ticker": "ATOM_USDT" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "ATOM_USDT" + "name": "Huobi", + "off_chain_ticker": "atomusdt" }, { - "name": "gate.io", - "off_chain_ticker": "ATOM_USDT" + "name": "Mexc", + "off_chain_ticker": "ATOMUSDT" + }, + { + "name": "Binance", + "off_chain_ticker": "ATOMUSDT" }, { - "name": "coinbase", + "name": "Kucoin", "off_chain_ticker": "ATOM-USDT" }, { - "name": "huobi", - "off_chain_ticker": "atomusdt" + "name": "Bybit", + "off_chain_ticker": "ATOMUSDT" }, { - "name": "okx", + "name": "CoinbasePro", "off_chain_ticker": "ATOM-USDT" }, { - "name": "binance", - "off_chain_ticker": "ATOMUSDT" + "name": "CryptoCom", + "off_chain_ticker": "ATOM_USDT" + }, + { + "name": "Okx", + "off_chain_ticker": "ATOM-USDT" } ] }, "AVAX/USD": { "providers": [ { - "name": "bitstamp", - "off_chain_ticker": "avaxusd" + "name": "KrakenAPI", + "off_chain_ticker": "AVAXUSD" }, { - "name": "coinbase_websocket", + "name": "Kraken", + "off_chain_ticker": "AVAX/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "AVAX-USD" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "AVAXUSD-PERP" + "name": "Bitstamp", + "off_chain_ticker": "avaxusd" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "AVAX-USD" }, { - "name": "kraken", - "off_chain_ticker": "AVAX/USD" + "name": "CryptoCom", + "off_chain_ticker": "AVAXUSD-PERP" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "AVAX-USD" } ] @@ -1042,23 +1082,23 @@ "AVAX/USDC": { "providers": [ { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "AVAX-USDC" }, { - "name": "mexc", + "name": "Mexc", "off_chain_ticker": "AVAXUSDC" }, { - "name": "bybit", - "off_chain_ticker": "AVAXUSDC" + "name": "Kucoin", + "off_chain_ticker": "AVAX-USDC" }, { - "name": "coinbase", - "off_chain_ticker": "AVAX-USDC" + "name": "Bybit", + "off_chain_ticker": "AVAXUSDC" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "AVAX-USDC" } ] @@ -1066,131 +1106,143 @@ "AVAX/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "AVAX-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "AVAXUSDT" }, { - "name": "mexc", - "off_chain_ticker": "AVAXUSDT" + "name": "Kraken", + "off_chain_ticker": "AVAX/USDT" }, { - "name": "coinbase_websocket", + "name": "CoinbaseProAPI", "off_chain_ticker": "AVAX-USDT" }, { - "name": "bybit", - "off_chain_ticker": "AVAXUSDT" + "name": "Gate", + "off_chain_ticker": "AVAX_USDT" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "AVAX_USDT" + "name": "Huobi", + "off_chain_ticker": "avaxusdt" }, { - "name": "gate.io", - "off_chain_ticker": "AVAX_USDT" + "name": "Mexc", + "off_chain_ticker": "AVAXUSDT" }, { - "name": "coinbase", - "off_chain_ticker": "AVAX-USDT" + "name": "Binance", + "off_chain_ticker": "AVAXUSDT" }, { - "name": "huobi", - "off_chain_ticker": "avaxusdt" + "name": "Kucoin", + "off_chain_ticker": "AVAX-USDT" }, { - "name": "kraken", - "off_chain_ticker": "AVAX/USDT" + "name": "Bybit", + "off_chain_ticker": "AVAXUSDT" }, { - "name": "okx", + "name": "CoinbasePro", "off_chain_ticker": "AVAX-USDT" }, { - "name": "binance", - "off_chain_ticker": "AVAXUSDT" + "name": "CryptoCom", + "off_chain_ticker": "AVAX_USDT" + }, + { + "name": "Okx", + "off_chain_ticker": "AVAX-USDT" } ] }, "BCH/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "BCH-USD" + "name": "KrakenAPI", + "off_chain_ticker": "BCHUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "BCH/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "BCH-USD" }, { - "name": "kraken", - "off_chain_ticker": "BCH/USD" + "name": "CoinbasePro", + "off_chain_ticker": "BCH-USD" } ] }, "BCH/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "BCH-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "BCHUSDT" }, { - "name": "mexc", - "off_chain_ticker": "BCHUSDT" + "name": "Gate", + "off_chain_ticker": "BCH_USDT" }, { - "name": "bybit", - "off_chain_ticker": "BCHUSDT" + "name": "Huobi", + "off_chain_ticker": "bchusdt" }, { - "name": "gate.io", - "off_chain_ticker": "BCH_USDT" + "name": "Mexc", + "off_chain_ticker": "BCHUSDT" }, { - "name": "huobi", - "off_chain_ticker": "bchusdt" + "name": "Binance", + "off_chain_ticker": "BCHUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "BCH-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "BCHUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "BCH-USDT" } ] }, "BLUR/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "BLUR-USD" + "name": "Kraken", + "off_chain_ticker": "BLUR/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "BLUR-USD" }, { - "name": "kraken", - "off_chain_ticker": "BLUR/USD" + "name": "CoinbasePro", + "off_chain_ticker": "BLUR-USD" } ] }, "BLUR/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "BLUR-USDT" + "name": "Gate", + "off_chain_ticker": "BLUR_USDT" }, { - "name": "mexc", + "name": "Mexc", "off_chain_ticker": "BLURUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "BLUR_USDT" + "name": "Kucoin", + "off_chain_ticker": "BLUR-USDT" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "BLUR-USDT" } ] @@ -1198,35 +1250,39 @@ "BTC/USD": { "providers": [ { - "name": "bitstamp", - "off_chain_ticker": "btcusd" + "name": "Coingecko", + "off_chain_ticker": "bitcoin/usd" }, { - "name": "coingecko", - "off_chain_ticker": "bitcoin/usd" + "name": "KrakenAPI", + "off_chain_ticker": "XXBTZUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "XBT/USD" }, { - "name": "coinbase_websocket", + "name": "CoinbaseProAPI", "off_chain_ticker": "BTC-USD" }, { - "name": "bitfinex", + "name": "Bitfinex", "off_chain_ticker": "BTCUSD" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "BTCUSD-PERP" + "name": "Bitstamp", + "off_chain_ticker": "btcusd" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "BTC-USD" }, { - "name": "kraken", - "off_chain_ticker": "XBT/USD" + "name": "CryptoCom", + "off_chain_ticker": "BTCUSD-PERP" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "BTC-USD" } ] @@ -1234,283 +1290,319 @@ "BTC/USDC": { "providers": [ { - "name": "bitstamp", - "off_chain_ticker": "btcusdc" + "name": "KrakenAPI", + "off_chain_ticker": "XBTUSDC" + }, + { + "name": "Kraken", + "off_chain_ticker": "XBT/USDC" }, { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "BTC-USDC" }, { - "name": "mexc", + "name": "Huobi", + "off_chain_ticker": "btcusdc" + }, + { + "name": "Mexc", "off_chain_ticker": "BTCUSDC" }, { - "name": "bybit", + "name": "Binance", "off_chain_ticker": "BTCUSDC" }, { - "name": "coinbase", + "name": "Kucoin", "off_chain_ticker": "BTC-USDC" }, { - "name": "huobi", + "name": "Bitstamp", "off_chain_ticker": "btcusdc" }, { - "name": "kraken", - "off_chain_ticker": "XBT/USDC" + "name": "Bybit", + "off_chain_ticker": "BTCUSDC" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "BTC-USDC" - }, - { - "name": "binance", - "off_chain_ticker": "BTCUSDC" } ] }, "BTC/USDT": { "providers": [ { - "name": "bitstamp", - "off_chain_ticker": "btcusdt" + "name": "KrakenAPI", + "off_chain_ticker": "XBTUSDT" }, { - "name": "kucoin", - "off_chain_ticker": "BTC-USDT" + "name": "Kraken", + "off_chain_ticker": "XBT/USDT" }, { - "name": "mexc", - "off_chain_ticker": "BTCUSDT" + "name": "CoinbaseProAPI", + "off_chain_ticker": "BTC-USDT" }, { - "name": "coinbase_websocket", - "off_chain_ticker": "BTC-USDT" + "name": "Gate", + "off_chain_ticker": "BTC_USDT" }, { - "name": "bybit", - "off_chain_ticker": "BTCUSDT" + "name": "Huobi", + "off_chain_ticker": "btcusdt" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "BTC_USDT" + "name": "Mexc", + "off_chain_ticker": "BTCUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "BTC_USDT" + "name": "Binance", + "off_chain_ticker": "BTCUSDT" }, { - "name": "coinbase", + "name": "Kucoin", "off_chain_ticker": "BTC-USDT" }, { - "name": "huobi", + "name": "Bitstamp", "off_chain_ticker": "btcusdt" }, { - "name": "kraken", - "off_chain_ticker": "XBT/USDT" + "name": "Bybit", + "off_chain_ticker": "BTCUSDT" }, { - "name": "okx", + "name": "CoinbasePro", "off_chain_ticker": "BTC-USDT" }, { - "name": "binance", - "off_chain_ticker": "BTCUSDT" + "name": "CryptoCom", + "off_chain_ticker": "BTC_USDT" + }, + { + "name": "Okx", + "off_chain_ticker": "BTC-USDT" } ] }, "COMP/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "COMP-USD" + "name": "KrakenAPI", + "off_chain_ticker": "COMPUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "COMP/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "COMP-USD" }, { - "name": "kraken", - "off_chain_ticker": "COMP/USD" + "name": "CoinbasePro", + "off_chain_ticker": "COMP-USD" } ] }, "COMP/USDT": { "providers": [ { - "name": "mexc", - "off_chain_ticker": "COMPUSDT" - }, - { - "name": "gate.io", + "name": "Gate", "off_chain_ticker": "COMP_USDT" }, { - "name": "okx", - "off_chain_ticker": "COMP-USDT" + "name": "Mexc", + "off_chain_ticker": "COMPUSDT" }, { - "name": "binance", + "name": "Binance", "off_chain_ticker": "COMPUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "COMP-USDT" } ] }, "CRV/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "CRV-USD" + "name": "KrakenAPI", + "off_chain_ticker": "CRVUSD" }, { - "name": "coinbase", + "name": "Kraken", + "off_chain_ticker": "CRV/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "CRV-USD" }, { - "name": "kraken", - "off_chain_ticker": "CRV/USD" + "name": "CoinbasePro", + "off_chain_ticker": "CRV-USD" } ] }, "CRV/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "CRV-USDT" + "name": "Gate", + "off_chain_ticker": "CRV_USDT" }, { - "name": "mexc", + "name": "Mexc", "off_chain_ticker": "CRVUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "CRV_USDT" + "name": "Binance", + "off_chain_ticker": "CRVUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "CRV-USDT" }, { - "name": "binance", - "off_chain_ticker": "CRVUSDT" + "name": "Okx", + "off_chain_ticker": "CRV-USDT" } ] }, "DOGE/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "DOGE-USD" + "name": "KrakenAPI", + "off_chain_ticker": "XDGUSD" }, { - "name": "coinbase", + "name": "Kraken", + "off_chain_ticker": "XDG/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "DOGE-USD" }, { - "name": "kraken", - "off_chain_ticker": "XDG/USD" + "name": "CoinbasePro", + "off_chain_ticker": "DOGE-USD" } ] }, "DOGE/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "DOGE-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "XDGUSDT" }, { - "name": "mexc", - "off_chain_ticker": "DOGEUSDT" + "name": "Gate", + "off_chain_ticker": "DOGE_USDT" }, { - "name": "bybit", - "off_chain_ticker": "DOGEUSDT" + "name": "Huobi", + "off_chain_ticker": "dogeusdt" }, { - "name": "gate.io", - "off_chain_ticker": "DOGE_USDT" + "name": "Mexc", + "off_chain_ticker": "DOGEUSDT" }, { - "name": "huobi", - "off_chain_ticker": "dogeusdt" + "name": "Binance", + "off_chain_ticker": "DOGEUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "DOGE-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "DOGEUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "DOGE-USDT" } ] }, "DOT/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "DOT-USD" + "name": "KrakenAPI", + "off_chain_ticker": "DOTUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "DOT/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "DOT-USD" }, { - "name": "kraken", - "off_chain_ticker": "DOT/USD" + "name": "CoinbasePro", + "off_chain_ticker": "DOT-USD" } ] }, "DOT/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "DOT-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "DOTUSDT" + }, + { + "name": "Gate", + "off_chain_ticker": "DOT_USDT" }, { - "name": "mexc", + "name": "Mexc", "off_chain_ticker": "DOTUSDT" }, { - "name": "bybit", + "name": "Binance", "off_chain_ticker": "DOTUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "DOT_USDT" - }, - { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "DOT-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "DOTUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "DOT-USDT" } ] }, "DYDX/USD": { "providers": [ { - "name": "coingecko", + "name": "Coingecko", "off_chain_ticker": "dydx-chain/usd" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "DYDXUSD-PERP" + "name": "KrakenAPI", + "off_chain_ticker": "DYDXUSD" }, { - "name": "coinbase", + "name": "Kraken", + "off_chain_ticker": "DYDX/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "DYDX-USD" }, { - "name": "kraken", - "off_chain_ticker": "DYDX/USD" + "name": "CryptoCom", + "off_chain_ticker": "DYDXUSD-PERP" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "DYDX-USD" } ] @@ -1518,7 +1610,7 @@ "DYDX/USDC": { "providers": [ { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "DYDX-USDC" } ] @@ -1526,51 +1618,55 @@ "DYDX/USDT": { "providers": [ { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "DYDX-USDT" }, { - "name": "mexc", - "off_chain_ticker": "DYDXUSDT" + "name": "Gate", + "off_chain_ticker": "DYDX_USDT" }, { - "name": "bybit", - "off_chain_ticker": "DYDXUSDT" + "name": "Huobi", + "off_chain_ticker": "dydxusdt" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "DYDX_USDT" + "name": "Mexc", + "off_chain_ticker": "DYDXUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "DYDX_USDT" + "name": "Binance", + "off_chain_ticker": "DYDXUSDT" }, { - "name": "coinbase", + "name": "Kucoin", "off_chain_ticker": "DYDX-USDT" }, { - "name": "huobi", - "off_chain_ticker": "dydxusdt" + "name": "Bybit", + "off_chain_ticker": "DYDXUSDT" }, { - "name": "okx", - "off_chain_ticker": "DYDX-USDT" + "name": "CryptoCom", + "off_chain_ticker": "DYDX_USDT" }, { - "name": "binance", - "off_chain_ticker": "DYDXUSDT" + "name": "Okx", + "off_chain_ticker": "DYDX-USDT" } ] }, "ETC/USD": { "providers": [ { - "name": "coinbase_websocket", + "name": "KrakenAPI", + "off_chain_ticker": "ETCUSD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "ETC-USD" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "ETC-USD" } ] @@ -1578,119 +1674,127 @@ "ETC/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "ETC-USDT" + "name": "Gate", + "off_chain_ticker": "ETC_USDT" }, { - "name": "mexc", - "off_chain_ticker": "ETCUSDT" + "name": "Huobi", + "off_chain_ticker": "etcusdt" }, { - "name": "gate.io", - "off_chain_ticker": "ETC_USDT" + "name": "Mexc", + "off_chain_ticker": "ETCUSDT" }, { - "name": "huobi", - "off_chain_ticker": "etcusdt" + "name": "Binance", + "off_chain_ticker": "ETCUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "ETC-USDT" }, { - "name": "binance", - "off_chain_ticker": "ETCUSDT" + "name": "Okx", + "off_chain_ticker": "ETC-USDT" } ] }, "ETH/BTC": { "providers": [ { - "name": "bitstamp", - "off_chain_ticker": "ethbtc" + "name": "Coingecko", + "off_chain_ticker": "ethereum/btc" }, { - "name": "coingecko", - "off_chain_ticker": "ethereum/btc" + "name": "KrakenAPI", + "off_chain_ticker": "XETHXXBT" + }, + { + "name": "Kraken", + "off_chain_ticker": "ETH/XBT" }, { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "ETH-BTC" }, { - "name": "mexc", - "off_chain_ticker": "ETHBTC" + "name": "Gate", + "off_chain_ticker": "ETH_BTC" }, { - "name": "coinbase_websocket", - "off_chain_ticker": "ETH-BTC" + "name": "Huobi", + "off_chain_ticker": "ethbtc" }, { - "name": "bitfinex", + "name": "Mexc", "off_chain_ticker": "ETHBTC" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "ETH_BTC" + "name": "Binance", + "off_chain_ticker": "ETHBTC" }, { - "name": "gate.io", - "off_chain_ticker": "ETH_BTC" + "name": "Kucoin", + "off_chain_ticker": "ETH-BTC" }, { - "name": "coinbase", - "off_chain_ticker": "ETH-BTC" + "name": "Bitfinex", + "off_chain_ticker": "ETHBTC" }, { - "name": "huobi", + "name": "Bitstamp", "off_chain_ticker": "ethbtc" }, { - "name": "kraken", - "off_chain_ticker": "ETH/XBT" + "name": "CoinbasePro", + "off_chain_ticker": "ETH-BTC" }, { - "name": "okx", - "off_chain_ticker": "ETH-BTC" + "name": "CryptoCom", + "off_chain_ticker": "ETH_BTC" }, { - "name": "binance", - "off_chain_ticker": "ETHBTC" + "name": "Okx", + "off_chain_ticker": "ETH-BTC" } ] }, "ETH/USD": { "providers": [ { - "name": "bitstamp", - "off_chain_ticker": "ethusd" + "name": "Coingecko", + "off_chain_ticker": "ethereum/usd" }, { - "name": "coingecko", - "off_chain_ticker": "ethereum/usd" + "name": "KrakenAPI", + "off_chain_ticker": "XETHZUSD" }, { - "name": "coinbase_websocket", + "name": "Kraken", + "off_chain_ticker": "ETH/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "ETH-USD" }, { - "name": "bitfinex", + "name": "Bitfinex", "off_chain_ticker": "ETHUSD" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "ETHUSD-PERP" + "name": "Bitstamp", + "off_chain_ticker": "ethusd" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "ETH-USD" }, { - "name": "kraken", - "off_chain_ticker": "ETH/USD" + "name": "CryptoCom", + "off_chain_ticker": "ETHUSD-PERP" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "ETH-USD" } ] @@ -1698,339 +1802,395 @@ "ETH/USDC": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "ETH-USDC" - }, - { - "name": "mexc", + "name": "KrakenAPI", "off_chain_ticker": "ETHUSDC" }, { - "name": "bybit", - "off_chain_ticker": "ETHUSDC" + "name": "Kraken", + "off_chain_ticker": "ETH/USDC" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "ETH-USDC" }, { - "name": "huobi", + "name": "Huobi", "off_chain_ticker": "ethusdc" }, { - "name": "kraken", - "off_chain_ticker": "ETH/USDC" + "name": "Mexc", + "off_chain_ticker": "ETHUSDC" + }, + { + "name": "Binance", + "off_chain_ticker": "ETHUSDC" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "ETH-USDC" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "ETHUSDC" + }, + { + "name": "Okx", + "off_chain_ticker": "ETH-USDC" } ] }, "ETH/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "ETH-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "ETHUSDT" }, { - "name": "mexc", - "off_chain_ticker": "ETHUSDT" + "name": "Kraken", + "off_chain_ticker": "ETH/USDT" }, { - "name": "coinbase_websocket", + "name": "CoinbaseProAPI", "off_chain_ticker": "ETH-USDT" }, { - "name": "bybit", - "off_chain_ticker": "ETHUSDT" + "name": "Gate", + "off_chain_ticker": "ETH_USDT" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "ETH_USDT" + "name": "Huobi", + "off_chain_ticker": "ethusdt" }, { - "name": "gate.io", - "off_chain_ticker": "ETH_USDT" + "name": "Mexc", + "off_chain_ticker": "ETHUSDT" }, { - "name": "coinbase", - "off_chain_ticker": "ETH-USDT" + "name": "Binance", + "off_chain_ticker": "ETHUSDT" }, { - "name": "huobi", - "off_chain_ticker": "ethusdt" + "name": "Kucoin", + "off_chain_ticker": "ETH-USDT" }, { - "name": "kraken", - "off_chain_ticker": "ETH/USDT" + "name": "Bybit", + "off_chain_ticker": "ETHUSDT" }, { - "name": "okx", + "name": "CoinbasePro", "off_chain_ticker": "ETH-USDT" }, { - "name": "binance", - "off_chain_ticker": "ETHUSDT" + "name": "CryptoCom", + "off_chain_ticker": "ETH_USDT" + }, + { + "name": "Okx", + "off_chain_ticker": "ETH-USDT" } ] }, "FIL/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "FIL-USD" + "name": "KrakenAPI", + "off_chain_ticker": "FILUSD" }, { - "name": "coinbase", + "name": "Kraken", + "off_chain_ticker": "FIL/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "FIL-USD" }, { - "name": "kraken", - "off_chain_ticker": "FIL/USD" + "name": "CoinbasePro", + "off_chain_ticker": "FIL-USD" } ] }, "FIL/USDT": { "providers": [ { - "name": "mexc", - "off_chain_ticker": "FILUSDT" - }, - { - "name": "gate.io", + "name": "Gate", "off_chain_ticker": "FIL_USDT" }, { - "name": "huobi", + "name": "Huobi", "off_chain_ticker": "filusdt" }, { - "name": "okx", - "off_chain_ticker": "FIL-USDT" + "name": "Mexc", + "off_chain_ticker": "FILUSDT" }, { - "name": "binance", + "name": "Binance", "off_chain_ticker": "FILUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "FIL-USDT" } ] }, "LDO/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "LDO-USD" + "name": "KrakenAPI", + "off_chain_ticker": "LDOUSD" }, { - "name": "coinbase", + "name": "Kraken", + "off_chain_ticker": "LDO/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "LDO-USD" }, { - "name": "kraken", - "off_chain_ticker": "LDO/USD" + "name": "CoinbasePro", + "off_chain_ticker": "LDO-USD" } ] }, "LDO/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "LDO-USDT" + "name": "Mexc", + "off_chain_ticker": "LDOUSDT" }, { - "name": "mexc", + "name": "Binance", "off_chain_ticker": "LDOUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "LDO-USDT" }, { - "name": "binance", - "off_chain_ticker": "LDOUSDT" + "name": "Okx", + "off_chain_ticker": "LDO-USDT" } ] }, "LINK/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "LINK-USD" + "name": "KrakenAPI", + "off_chain_ticker": "LINKUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "LINK/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "LINK-USD" }, { - "name": "kraken", - "off_chain_ticker": "LINK/USD" + "name": "CoinbasePro", + "off_chain_ticker": "LINK-USD" } ] }, "LINK/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "LINK-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "LINKUSDT" }, { - "name": "mexc", + "name": "Mexc", "off_chain_ticker": "LINKUSDT" }, { - "name": "bybit", + "name": "Binance", "off_chain_ticker": "LINKUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "LINK-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "LINKUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "LINK-USDT" } ] }, "LTC/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "LTC-USD" + "name": "KrakenAPI", + "off_chain_ticker": "XLTCZUSD" }, { - "name": "coinbase", + "name": "Kraken", + "off_chain_ticker": "XLTCZ/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "LTC-USD" }, { - "name": "kraken", - "off_chain_ticker": "XLTCZ/USD" + "name": "CoinbasePro", + "off_chain_ticker": "LTC-USD" } ] }, "LTC/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "LTC-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "LTCUSDT" }, { - "name": "mexc", - "off_chain_ticker": "LTCUSDT" + "name": "Huobi", + "off_chain_ticker": "ltcusdt" }, { - "name": "bybit", + "name": "Mexc", "off_chain_ticker": "LTCUSDT" }, { - "name": "huobi", - "off_chain_ticker": "ltcusdt" + "name": "Binance", + "off_chain_ticker": "LTCUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "LTC-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "LTCUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "LTC-USDT" } ] }, "MATIC/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "MATIC-USD" + "name": "KrakenAPI", + "off_chain_ticker": "MATICUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "MATIC/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "MATIC-USD" }, { - "name": "kraken", - "off_chain_ticker": "MATIC/USD" + "name": "CoinbasePro", + "off_chain_ticker": "MATIC-USD" } ] }, "MATIC/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "MATIC-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "MATICUSDT" }, { - "name": "mexc", - "off_chain_ticker": "MATICUSDT" + "name": "Gate", + "off_chain_ticker": "MATIC_USDT" }, { - "name": "bybit", - "off_chain_ticker": "MATICUSDT" + "name": "Huobi", + "off_chain_ticker": "maticusdt" }, { - "name": "gate.io", - "off_chain_ticker": "MATIC_USDT" + "name": "Mexc", + "off_chain_ticker": "MATICUSDT" }, { - "name": "huobi", - "off_chain_ticker": "maticusdt" + "name": "Binance", + "off_chain_ticker": "MATICUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "MATIC-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "MATICUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "MATIC-USDT" } ] }, "MKR/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "MKR-USD" + "name": "KrakenAPI", + "off_chain_ticker": "MKRUSD" }, { - "name": "coinbase", + "name": "Kraken", + "off_chain_ticker": "MKR/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "MKR-USD" }, { - "name": "kraken", - "off_chain_ticker": "MKR/USD" + "name": "CoinbasePro", + "off_chain_ticker": "MKR-USD" } ] }, "MKR/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "MKR-USDT" + "name": "Mexc", + "off_chain_ticker": "MKRUSDT" }, { - "name": "mexc", + "name": "Binance", "off_chain_ticker": "MKRUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "MKR-USDT" }, { - "name": "binance", - "off_chain_ticker": "MKRUSDT" + "name": "Okx", + "off_chain_ticker": "MKR-USDT" + } + ] + }, + "MOG/USD": { + "providers": [ + { + "name": "GeckoTerminal", + "off_chain_ticker": "0xaaee1a9723aadb7afa2810263653a34ba2c21c7a" } ] }, "NEAR/USD": { "providers": [ { - "name": "coinbase_websocket", + "name": "KrakenAPI", + "off_chain_ticker": "NEARUSD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "NEAR-USD" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "NEAR-USD" } ] @@ -2038,39 +2198,43 @@ "NEAR/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "NEAR-USDT" + "name": "Gate", + "off_chain_ticker": "NEAR_USDT" }, { - "name": "mexc", - "off_chain_ticker": "NEARUSDT" + "name": "Huobi", + "off_chain_ticker": "nearusdt" }, { - "name": "gate.io", - "off_chain_ticker": "NEAR_USDT" + "name": "Mexc", + "off_chain_ticker": "NEARUSDT" }, { - "name": "huobi", - "off_chain_ticker": "nearusdt" + "name": "Binance", + "off_chain_ticker": "NEARUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "NEAR-USDT" }, { - "name": "binance", - "off_chain_ticker": "NEARUSDT" + "name": "Okx", + "off_chain_ticker": "NEAR-USDT" } ] }, "OP/USD": { "providers": [ { - "name": "coinbase_websocket", + "name": "KrakenAPI", + "off_chain_ticker": "OPUSD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "OP-USD" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "OP-USD" } ] @@ -2078,55 +2242,55 @@ "OP/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "OP-USDT" + "name": "Gate", + "off_chain_ticker": "OP_USDT" }, { - "name": "mexc", + "name": "Mexc", "off_chain_ticker": "OPUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "OP_USDT" + "name": "Binance", + "off_chain_ticker": "OPUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "OP-USDT" }, { - "name": "binance", - "off_chain_ticker": "OPUSDT" + "name": "Okx", + "off_chain_ticker": "OP-USDT" } ] }, "OSMO/USD": { "providers": [ { - "name": "coingecko", + "name": "Coingecko", "off_chain_ticker": "osmosis/usd" }, { - "name": "coinbase_websocket", + "name": "CoinbaseProAPI", "off_chain_ticker": "OSMO-USD" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "OSMO_USD" + "name": "CoinbasePro", + "off_chain_ticker": "OSMO-USD" }, { - "name": "coinbase", - "off_chain_ticker": "OSMO-USD" + "name": "CryptoCom", + "off_chain_ticker": "OSMO_USD" } ] }, "OSMO/USDC": { "providers": [ { - "name": "coinbase_websocket", + "name": "CoinbaseProAPI", "off_chain_ticker": "OSMO-USDC" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "OSMO-USDC" } ] @@ -2134,15 +2298,15 @@ "OSMO/USDT": { "providers": [ { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "OSMO-USDT" }, { - "name": "coinbase_websocket", + "name": "Kucoin", "off_chain_ticker": "OSMO-USDT" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "OSMO-USDT" } ] @@ -2150,7 +2314,15 @@ "PEPE/USD": { "providers": [ { - "name": "kraken", + "name": "GeckoTerminal", + "off_chain_ticker": "0x6982508145454Ce325dDbE47a25d4ec3d2311933" + }, + { + "name": "KrakenAPI", + "off_chain_ticker": "PEPEUSD" + }, + { + "name": "Kraken", "off_chain_ticker": "PEPE/USD" } ] @@ -2158,39 +2330,43 @@ "PEPE/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "PEPE-USDT" + "name": "Gate", + "off_chain_ticker": "PEPE_USDT" }, { - "name": "mexc", + "name": "Mexc", "off_chain_ticker": "PEPEUSDT" }, { - "name": "bybit", + "name": "Binance", "off_chain_ticker": "PEPEUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "PEPE_USDT" - }, - { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "PEPE-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "PEPEUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "PEPE-USDT" } ] }, "SEI/USD": { "providers": [ { - "name": "coinbase_websocket", + "name": "KrakenAPI", + "off_chain_ticker": "SEIUSD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "SEI-USD" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "SEI-USD" } ] @@ -2198,27 +2374,27 @@ "SEI/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "SEI-USDT" + "name": "Gate", + "off_chain_ticker": "SEI_USDT" }, { - "name": "mexc", - "off_chain_ticker": "SEIUSDT" + "name": "Huobi", + "off_chain_ticker": "seiusdt" }, { - "name": "bybit", + "name": "Mexc", "off_chain_ticker": "SEIUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "SEI_USDT" + "name": "Binance", + "off_chain_ticker": "SEIUSDT" }, { - "name": "huobi", - "off_chain_ticker": "seiusdt" + "name": "Kucoin", + "off_chain_ticker": "SEI-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "SEIUSDT" } ] @@ -2226,79 +2402,91 @@ "SHIB/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "SHIB-USD" + "name": "KrakenAPI", + "off_chain_ticker": "SHIBUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "SHIB/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "SHIB-USD" }, { - "name": "kraken", - "off_chain_ticker": "SHIB/USD" + "name": "CoinbasePro", + "off_chain_ticker": "SHIB-USD" } ] }, "SHIB/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "SHIB-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "SHIBUSDT" }, { - "name": "mexc", - "off_chain_ticker": "SHIBUSDT" + "name": "Gate", + "off_chain_ticker": "SHIB_USDT" }, { - "name": "bybit", + "name": "Mexc", "off_chain_ticker": "SHIBUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "SHIB_USDT" + "name": "Binance", + "off_chain_ticker": "SHIBUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "SHIB-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "SHIBUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "SHIB-USDT" } ] }, "SOL/USD": { "providers": [ { - "name": "bitstamp", - "off_chain_ticker": "solusd" + "name": "Coingecko", + "off_chain_ticker": "solana/usd" }, { - "name": "coingecko", - "off_chain_ticker": "solana/usd" + "name": "KrakenAPI", + "off_chain_ticker": "SOLUSD" }, { - "name": "coinbase_websocket", + "name": "Kraken", + "off_chain_ticker": "SOL/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "SOL-USD" }, { - "name": "bitfinex", + "name": "Bitfinex", "off_chain_ticker": "SOLUSD" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "SOLUSD-PERP" + "name": "Bitstamp", + "off_chain_ticker": "solusd" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "SOL-USD" }, { - "name": "kraken", - "off_chain_ticker": "SOL/USD" + "name": "CryptoCom", + "off_chain_ticker": "SOLUSD-PERP" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "SOL-USD" } ] @@ -2306,95 +2494,103 @@ "SOL/USDC": { "providers": [ { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "SOL-USDC" }, { - "name": "mexc", - "off_chain_ticker": "SOLUSDC" + "name": "Gate", + "off_chain_ticker": "SOL_USDC" }, { - "name": "coinbase_websocket", - "off_chain_ticker": "SOL-USDC" + "name": "Mexc", + "off_chain_ticker": "SOLUSDC" }, { - "name": "bybit", + "name": "Binance", "off_chain_ticker": "SOLUSDC" }, { - "name": "gate.io", - "off_chain_ticker": "SOL_USDC" + "name": "Kucoin", + "off_chain_ticker": "SOL-USDC" }, { - "name": "coinbase", - "off_chain_ticker": "SOL-USDC" + "name": "Bybit", + "off_chain_ticker": "SOLUSDC" }, { - "name": "okx", + "name": "CoinbasePro", "off_chain_ticker": "SOL-USDC" }, { - "name": "binance", - "off_chain_ticker": "SOLUSDC" + "name": "Okx", + "off_chain_ticker": "SOL-USDC" } ] }, "SOL/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "SOL-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "SOLUSDT" }, { - "name": "mexc", - "off_chain_ticker": "SOLUSDT" + "name": "Kraken", + "off_chain_ticker": "SOL/USDT" }, { - "name": "coinbase_websocket", + "name": "CoinbaseProAPI", "off_chain_ticker": "SOL-USDT" }, { - "name": "bybit", - "off_chain_ticker": "SOLUSDT" + "name": "Gate", + "off_chain_ticker": "SOL_USDT" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "SOL_USDT" + "name": "Huobi", + "off_chain_ticker": "solusdt" }, { - "name": "gate.io", - "off_chain_ticker": "SOL_USDT" + "name": "Mexc", + "off_chain_ticker": "SOLUSDT" }, { - "name": "coinbase", - "off_chain_ticker": "SOL-USDT" + "name": "Binance", + "off_chain_ticker": "SOLUSDT" }, { - "name": "huobi", - "off_chain_ticker": "solusdt" + "name": "Kucoin", + "off_chain_ticker": "SOL-USDT" }, { - "name": "kraken", - "off_chain_ticker": "SOL/USDT" + "name": "Bybit", + "off_chain_ticker": "SOLUSDT" }, { - "name": "okx", + "name": "CoinbasePro", "off_chain_ticker": "SOL-USDT" }, { - "name": "binance", - "off_chain_ticker": "SOLUSDT" + "name": "CryptoCom", + "off_chain_ticker": "SOL_USDT" + }, + { + "name": "Okx", + "off_chain_ticker": "SOL-USDT" } ] }, "SUI/USD": { "providers": [ { - "name": "coinbase_websocket", + "name": "KrakenAPI", + "off_chain_ticker": "SUIUSD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "SUI-USD" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "SUI-USD" } ] @@ -2402,63 +2598,63 @@ "SUI/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "SUI-USDT" + "name": "Gate", + "off_chain_ticker": "SUI_USDT" }, { - "name": "mexc", - "off_chain_ticker": "SUIUSDT" + "name": "Huobi", + "off_chain_ticker": "suiusdt" }, { - "name": "bybit", + "name": "Mexc", "off_chain_ticker": "SUIUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "SUI_USDT" - }, - { - "name": "huobi", - "off_chain_ticker": "suiusdt" + "name": "Binance", + "off_chain_ticker": "SUIUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "SUI-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "SUIUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "SUI-USDT" } ] }, "TIA/USD": { "providers": [ { - "name": "coingecko", + "name": "Coingecko", "off_chain_ticker": "celestia/usd" }, { - "name": "coinbase_websocket", - "off_chain_ticker": "TIA-USD" + "name": "Kraken", + "off_chain_ticker": "TIA/USD" }, { - "name": "bitfinex", - "off_chain_ticker": "TIAUSD" + "name": "CoinbaseProAPI", + "off_chain_ticker": "TIA-USD" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "TIAUSD-PERP" + "name": "Bitfinex", + "off_chain_ticker": "TIAUSD" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "TIA-USD" }, { - "name": "kraken", - "off_chain_ticker": "TIA/USD" + "name": "CryptoCom", + "off_chain_ticker": "TIAUSD-PERP" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "TIA-USD" } ] @@ -2466,11 +2662,11 @@ "TIA/USDC": { "providers": [ { - "name": "coinbase_websocket", + "name": "CoinbaseProAPI", "off_chain_ticker": "TIA-USDC" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "TIA-USDC" } ] @@ -2478,31 +2674,31 @@ "TIA/USDT": { "providers": [ { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "TIA-USDT" }, { - "name": "coinbase_websocket", - "off_chain_ticker": "TIA-USDT" + "name": "Gate", + "off_chain_ticker": "TIA_USDT" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "TIA_USDT" + "name": "Huobi", + "off_chain_ticker": "tiausdt" }, { - "name": "gate.io", - "off_chain_ticker": "TIA_USDT" + "name": "Kucoin", + "off_chain_ticker": "TIA-USDT" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "TIA-USDT" }, { - "name": "huobi", - "off_chain_ticker": "tiausdt" + "name": "CryptoCom", + "off_chain_ticker": "TIA_USDT" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "TIA-USDT" } ] @@ -2510,7 +2706,11 @@ "TRX/USD": { "providers": [ { - "name": "kraken", + "name": "KrakenAPI", + "off_chain_ticker": "TRXUSD" + }, + { + "name": "Kraken", "off_chain_ticker": "TRX/USD" } ] @@ -2518,87 +2718,91 @@ "TRX/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "TRX-USDT" + "name": "Gate", + "off_chain_ticker": "TRX_USDT" }, { - "name": "mexc", - "off_chain_ticker": "TRXUSDT" + "name": "Huobi", + "off_chain_ticker": "trxusdt" }, { - "name": "bybit", + "name": "Mexc", "off_chain_ticker": "TRXUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "TRX_USDT" - }, - { - "name": "huobi", - "off_chain_ticker": "trxusdt" + "name": "Binance", + "off_chain_ticker": "TRXUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "TRX-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "TRXUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "TRX-USDT" } ] }, "UNI/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "UNI-USD" + "name": "KrakenAPI", + "off_chain_ticker": "UNIUSD" }, { - "name": "coinbase", + "name": "Kraken", + "off_chain_ticker": "UNI/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "UNI-USD" }, { - "name": "kraken", - "off_chain_ticker": "UNI/USD" + "name": "CoinbasePro", + "off_chain_ticker": "UNI-USD" } ] }, "UNI/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "UNI-USDT" + "name": "Gate", + "off_chain_ticker": "UNI_USDT" }, { - "name": "bybit", + "name": "Binance", "off_chain_ticker": "UNIUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "UNI_USDT" - }, - { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "UNI-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "UNIUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "UNI-USDT" } ] }, "USDC/USD": { "providers": [ { - "name": "coinbase", - "off_chain_ticker": "USDC-USD" + "name": "Kraken", + "off_chain_ticker": "USDC/USD" }, { - "name": "kraken", - "off_chain_ticker": "USDC/USD" + "name": "CoinbaseProAPI", + "off_chain_ticker": "USDC-USD" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "USDC-USD" } ] @@ -2606,75 +2810,87 @@ "USDC/USDT": { "providers": [ { - "name": "bitstamp", - "off_chain_ticker": "usdcusdt" + "name": "KrakenAPI", + "off_chain_ticker": "USDCUSDT" + }, + { + "name": "Kraken", + "off_chain_ticker": "USDC/USDT" }, { - "name": "kucoin", + "name": "CoinbaseProAPI", "off_chain_ticker": "USDC-USDT" }, { - "name": "mexc", - "off_chain_ticker": "USDCUSDT" + "name": "Gate", + "off_chain_ticker": "USDC_USDT" }, { - "name": "coinbase_websocket", - "off_chain_ticker": "USDC-USDT" + "name": "Huobi", + "off_chain_ticker": "usdcusdt" }, { - "name": "bybit", + "name": "Mexc", "off_chain_ticker": "USDCUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "USDC_USDT" + "name": "Binance", + "off_chain_ticker": "USDCUSDT" }, { - "name": "coinbase", + "name": "Kucoin", "off_chain_ticker": "USDC-USDT" }, { - "name": "huobi", + "name": "Bitstamp", "off_chain_ticker": "usdcusdt" }, { - "name": "kraken", - "off_chain_ticker": "USDC/USDT" + "name": "Bybit", + "off_chain_ticker": "USDCUSDT" }, { - "name": "okx", + "name": "CoinbasePro", "off_chain_ticker": "USDC-USDT" }, { - "name": "binance", - "off_chain_ticker": "USDCUSDT" + "name": "Okx", + "off_chain_ticker": "USDC-USDT" } ] }, "USDT/USD": { "providers": [ { - "name": "bitstamp", - "off_chain_ticker": "usdtusd" + "name": "KrakenAPI", + "off_chain_ticker": "USDTZUSD" }, { - "name": "coinbase_websocket", + "name": "Kraken", + "off_chain_ticker": "USDT/USD" + }, + { + "name": "CoinbaseProAPI", "off_chain_ticker": "USDT-USD" }, { - "name": "crypto_dot_com", - "off_chain_ticker": "USDT_USD" + "name": "Binance", + "off_chain_ticker": "USDTUSD" + }, + { + "name": "Bitstamp", + "off_chain_ticker": "usdtusd" }, { - "name": "coinbase", + "name": "CoinbasePro", "off_chain_ticker": "USDT-USD" }, { - "name": "kraken", - "off_chain_ticker": "USDT/USD" + "name": "CryptoCom", + "off_chain_ticker": "USDT_USD" }, { - "name": "okx", + "name": "Okx", "off_chain_ticker": "USDT-USD" } ] @@ -2682,120 +2898,132 @@ "WLD/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "WLD-USDT" + "name": "Gate", + "off_chain_ticker": "WLD_USDT" }, { - "name": "mexc", - "off_chain_ticker": "WLDUSDT" + "name": "Huobi", + "off_chain_ticker": "wldusdt" }, { - "name": "bybit", + "name": "Mexc", "off_chain_ticker": "WLDUSDT" }, { - "name": "gate.io", - "off_chain_ticker": "WLD_USDT" - }, - { - "name": "huobi", - "off_chain_ticker": "wldusdt" + "name": "Binance", + "off_chain_ticker": "WLDUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "WLD-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "WLDUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "WLD-USDT" } ] }, "XLM/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "XLM-USD" + "name": "KrakenAPI", + "off_chain_ticker": "XXLMZUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "XXLMZ/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "XLM-USD" }, { - "name": "kraken", - "off_chain_ticker": "XXLMZ/USD" + "name": "CoinbasePro", + "off_chain_ticker": "XLM-USD" } ] }, "XLM/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "XLM-USDT" - }, - { - "name": "mexc", + "name": "Mexc", "off_chain_ticker": "XLMUSDT" }, { - "name": "bybit", + "name": "Binance", "off_chain_ticker": "XLMUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "XLM-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "XLMUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "XLM-USDT" } ] }, "XRP/USD": { "providers": [ { - "name": "coinbase_websocket", - "off_chain_ticker": "XRP-USD" + "name": "KrakenAPI", + "off_chain_ticker": "XXRPZUSD" + }, + { + "name": "Kraken", + "off_chain_ticker": "XXRPZ/USD" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "off_chain_ticker": "XRP-USD" }, { - "name": "kraken", - "off_chain_ticker": "XXRPZ/USD" + "name": "CoinbasePro", + "off_chain_ticker": "XRP-USD" } ] }, "XRP/USDT": { "providers": [ { - "name": "kucoin", - "off_chain_ticker": "XRP-USDT" + "name": "KrakenAPI", + "off_chain_ticker": "XRPUSDT" }, { - "name": "mexc", - "off_chain_ticker": "XRPUSDT" + "name": "Gate", + "off_chain_ticker": "XRP_USDT" }, { - "name": "bybit", - "off_chain_ticker": "XRPUSDT" + "name": "Huobi", + "off_chain_ticker": "xrpusdt" }, { - "name": "gate.io", - "off_chain_ticker": "XRP_USDT" + "name": "Mexc", + "off_chain_ticker": "XRPUSDT" }, { - "name": "huobi", - "off_chain_ticker": "xrpusdt" + "name": "Binance", + "off_chain_ticker": "XRPUSDT" }, { - "name": "okx", + "name": "Kucoin", "off_chain_ticker": "XRP-USDT" }, { - "name": "binance", + "name": "Bybit", "off_chain_ticker": "XRPUSDT" + }, + { + "name": "Okx", + "off_chain_ticker": "XRP-USDT" } ] } diff --git a/protocol/daemons/slinky/config/oracle.json b/protocol/daemons/slinky/config/oracle.json index bbcf0d4d48..23a1738f70 100644 --- a/protocol/daemons/slinky/config/oracle.json +++ b/protocol/daemons/slinky/config/oracle.json @@ -3,15 +3,16 @@ "maxPriceAge": 120000000000, "providers": [ { - "name": "binance", + "name": "Binance", "api": { "enabled": true, "timeout": 500000000, "interval": 150000000, + "reconnectTimeout": 2000000000, "maxQueries": 1, "atomic": true, "url": "https://api.binance.com/api/v3/ticker/price?symbols=%s%s%s", - "name": "binance" + "name": "Binance" }, "webSocket": { "enabled": false, @@ -28,18 +29,20 @@ "pingInterval": 0, "maxReadErrorCount": 0, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "coinbase", + "name": "CoinbaseProAPI", "api": { "enabled": true, "timeout": 500000000, - "interval": 20000000, - "maxQueries": 10, + "interval": 100000000, + "reconnectTimeout": 2000000000, + "maxQueries": 5, "atomic": false, "url": "https://api.coinbase.com/v2/prices/%s/spot", - "name": "coinbase" + "name": "CoinbaseProAPI" }, "webSocket": { "enabled": false, @@ -56,18 +59,80 @@ "pingInterval": 0, "maxReadErrorCount": 0, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "coingecko", + "name": "Coingecko", "api": { "enabled": true, "timeout": 500000000, "interval": 15000000000, + "reconnectTimeout": 2000000000, "maxQueries": 1, "atomic": true, "url": "https://api.coingecko.com/api/v3", - "name": "coingecko" + "name": "Coingecko" + }, + "webSocket": { + "enabled": false, + "maxBufferSize": 0, + "reconnectionTimeout": 0, + "wss": "", + "name": "", + "readBufferSize": 0, + "writeBufferSize": 0, + "handshakeTimeout": 0, + "enableCompression": false, + "readTimeout": 0, + "writeTimeout": 0, + "pingInterval": 0, + "maxReadErrorCount": 0, + "maxSubscriptionsPerConnection": 0 + }, + "type": "price_provider" + }, + { + "name": "GeckoTerminal", + "api": { + "enabled": true, + "timeout": 500000000, + "interval": 5000000000, + "reconnectTimeout": 2000000000, + "maxQueries": 1, + "atomic": false, + "url": "https://api.geckoterminal.com/api/v2/simple/networks/eth/token_price/%s", + "name": "GeckoTerminal" + }, + "webSocket": { + "enabled": false, + "maxBufferSize": 0, + "reconnectionTimeout": 0, + "wss": "", + "name": "", + "readBufferSize": 0, + "writeBufferSize": 0, + "handshakeTimeout": 0, + "enableCompression": false, + "readTimeout": 0, + "writeTimeout": 0, + "pingInterval": 0, + "maxReadErrorCount": 0, + "maxSubscriptionsPerConnection": 0 + }, + "type": "price_provider" + }, + { + "name": "KrakenAPI", + "api": { + "enabled": true, + "timeout": 500000000, + "interval": 150000000, + "reconnectTimeout": 2000000000, + "maxQueries": 1, + "atomic": true, + "url": "https://api.kraken.com/0/public/Ticker?pair=%s", + "name": "KrakenAPI" }, "webSocket": { "enabled": false, @@ -84,14 +149,16 @@ "pingInterval": 0, "maxReadErrorCount": 0, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "bitfinex", + "name": "Bitfinex", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -102,7 +169,7 @@ "maxBufferSize": 1000, "reconnectionTimeout": 10000000000, "wss": "wss://api-pub.bitfinex.com/ws/2", - "name": "bitfinex", + "name": "Bitfinex", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -112,14 +179,16 @@ "pingInterval": 0, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "bitstamp", + "name": "Bitstamp", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -130,7 +199,7 @@ "maxBufferSize": 1024, "reconnectionTimeout": 10000000000, "wss": "wss://ws.bitstamp.net", - "name": "bitstamp", + "name": "Bitstamp", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -140,14 +209,16 @@ "pingInterval": 10000000000, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "bybit", + "name": "Bybit", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -158,7 +229,7 @@ "maxBufferSize": 1000, "reconnectionTimeout": 10000000000, "wss": "wss://stream.bybit.com/v5/public/spot", - "name": "bybit", + "name": "Bybit", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -168,14 +239,16 @@ "pingInterval": 15000000000, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "coinbase_websocket", + "name": "CoinbasePro", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -186,7 +259,7 @@ "maxBufferSize": 1024, "reconnectionTimeout": 10000000000, "wss": "wss://ws-feed.exchange.coinbase.com", - "name": "coinbase_websocket", + "name": "CoinbasePro", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -196,14 +269,16 @@ "pingInterval": 0, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "crypto_dot_com", + "name": "CryptoCom", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -214,7 +289,7 @@ "maxBufferSize": 1024, "reconnectionTimeout": 10000000000, "wss": "wss://stream.crypto.com/exchange/v1/market", - "name": "crypto_dot_com", + "name": "CryptoCom", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -224,14 +299,16 @@ "pingInterval": 0, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "gate.io", + "name": "Gate", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -242,7 +319,7 @@ "maxBufferSize": 1000, "reconnectionTimeout": 10000000000, "wss": "wss://api.gateio.ws/ws/v4/", - "name": "gate.io", + "name": "Gate", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -252,14 +329,16 @@ "pingInterval": 0, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "huobi", + "name": "Huobi", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -270,7 +349,7 @@ "maxBufferSize": 1000, "reconnectionTimeout": 10000000000, "wss": "wss://api.huobi.pro/ws", - "name": "huobi", + "name": "Huobi", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -280,14 +359,16 @@ "pingInterval": 0, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "kraken", + "name": "Kraken", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -298,7 +379,7 @@ "maxBufferSize": 1000, "reconnectionTimeout": 10000000000, "wss": "wss://ws.kraken.com", - "name": "kraken", + "name": "Kraken", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -308,25 +389,27 @@ "pingInterval": 0, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "kucoin", + "name": "Kucoin", "api": { "enabled": false, "timeout": 5000000000, "interval": 60000000000, + "reconnectTimeout": 0, "maxQueries": 1, "atomic": false, "url": "https://api.kucoin.com", - "name": "kucoin" + "name": "Kucoin" }, "webSocket": { "enabled": true, "maxBufferSize": 1024, "reconnectionTimeout": 10000000000, "wss": "wss://ws-api-spot.kucoin.com/", - "name": "kucoin", + "name": "Kucoin", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -336,14 +419,16 @@ "pingInterval": 10000000000, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" }, { - "name": "mexc", + "name": "Mexc", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -354,7 +439,7 @@ "maxBufferSize": 1000, "reconnectionTimeout": 10000000000, "wss": "wss://wbs.mexc.com/ws", - "name": "mexc", + "name": "Mexc", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -363,15 +448,17 @@ "writeTimeout": 45000000000, "pingInterval": 20000000000, "maxReadErrorCount": 100, - "maxSubscriptionsPerConnection": 0 - } + "maxSubscriptionsPerConnection": 20 + }, + "type": "price_provider" }, { - "name": "okx", + "name": "Okx", "api": { "enabled": false, "timeout": 0, "interval": 0, + "reconnectTimeout": 0, "maxQueries": 0, "atomic": false, "url": "", @@ -382,7 +469,7 @@ "maxBufferSize": 1000, "reconnectionTimeout": 10000000000, "wss": "wss://ws.okx.com:8443/ws/v5/public", - "name": "okx", + "name": "Okx", "readBufferSize": 0, "writeBufferSize": 0, "handshakeTimeout": 45000000000, @@ -392,10 +479,11 @@ "pingInterval": 0, "maxReadErrorCount": 100, "maxSubscriptionsPerConnection": 0 - } + }, + "type": "price_provider" } ], - "production": false, + "production": true, "metrics": { "prometheusServerAddress": "0.0.0.0:8002", "enabled": true diff --git a/protocol/go.mod b/protocol/go.mod index 01364cf1fb..f4a3afa36e 100644 --- a/protocol/go.mod +++ b/protocol/go.mod @@ -69,6 +69,7 @@ require ( github.com/skip-mev/slinky v0.2.1-0.20240301171048-53cc00fdca4e github.com/spf13/viper v1.18.2 github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d + go.uber.org/zap v1.27.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/protobuf v1.32.0 ) @@ -393,7 +394,6 @@ require ( go.opentelemetry.io/otel/metric v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect golang.org/x/crypto v0.19.0 // indirect golang.org/x/exp/typeparams v0.0.0-20231219180239-dc181d75b848 // indirect golang.org/x/mod v0.15.0 // indirect diff --git a/protocol/scripts/genesis/sample_pregenesis.json b/protocol/scripts/genesis/sample_pregenesis.json index 887ad44c85..046f53e67f 100644 --- a/protocol/scripts/genesis/sample_pregenesis.json +++ b/protocol/scripts/genesis/sample_pregenesis.json @@ -1831,10 +1831,10 @@ "consensus": { "params": { "abci": { - "vote_extensions_enable_height": "0" + "vote_extensions_enable_height": "1" }, "block": { - "max_bytes": "22020096", + "max_bytes": "4194304", "max_gas": "-1" }, "evidence": { @@ -1852,12 +1852,6 @@ } } }, - "consensus_params": { - "block": { - "max_bytes": "4194304", - "max_gas": "-1" - } - }, "genesis_time": "2023-12-31T00:00:00Z", "initial_height": 1 } diff --git a/protocol/testing/e2e/trading_rewards/trading_rewards_test.go b/protocol/testing/e2e/trading_rewards/trading_rewards_test.go index 5c83a2b3aa..9541d84054 100644 --- a/protocol/testing/e2e/trading_rewards/trading_rewards_test.go +++ b/protocol/testing/e2e/trading_rewards/trading_rewards_test.go @@ -3,6 +3,7 @@ package trading_rewards_test import ( sdkmath "cosmossdk.io/math" "github.com/cosmos/gogoproto/proto" + "github.com/dydxprotocol/v4-chain/protocol/app/flags" "math/big" "testing" "time" @@ -705,6 +706,7 @@ func TestTradingRewards(t *testing.T) { msgSender := msgsender.NewIndexerMessageSenderInMemoryCollector() appOpts := map[string]interface{}{ indexer.MsgSenderInstanceForTest: msgSender, + flags.VEOracleEnabled: false, } tApp := testapp.NewTestAppBuilder(t). // UpdateIndexPrice only contacts the tApp.App.Server causing non-determinism in the diff --git a/protocol/testing/genesis.sh b/protocol/testing/genesis.sh index f1e342af9f..747b02bbbe 100755 --- a/protocol/testing/genesis.sh +++ b/protocol/testing/genesis.sh @@ -77,8 +77,9 @@ function edit_genesis() { dasel put -t string -f "$GENESIS" '.genesis_time' -v "$GENESIS_TIME" # Consensus params - dasel put -t string -f "$GENESIS" '.consensus_params.block.max_bytes' -v '4194304' - dasel put -t string -f "$GENESIS" '.consensus_params.block.max_gas' -v '-1' + dasel put -t string -f "$GENESIS" '.consensus.params.block.max_bytes' -v '4194304' + dasel put -t string -f "$GENESIS" '.consensus.params.block.max_gas' -v '-1' + dasel put -t string -f "$GENESIS" '.consensus.params.abci.vote_extensions_enable_height' -v '1' # Update crisis module. dasel put -t string -f "$GENESIS" '.app_state.crisis.constant_fee.denom' -v "$NATIVE_TOKEN" diff --git a/protocol/testing/testnet-local/local.sh b/protocol/testing/testnet-local/local.sh index 6898682118..c8b599d70d 100755 --- a/protocol/testing/testnet-local/local.sh +++ b/protocol/testing/testnet-local/local.sh @@ -1,5 +1,5 @@ #!/bin/bash -set -eo pipefail +set -exo pipefail # This file initializes muliple validators for local and CI testing purposes. # This file should be run as part of `docker-compose.yml`. @@ -159,8 +159,9 @@ use_slinky() { # Disable pricefeed-daemon dasel put -t bool -f "$CONFIG_FOLDER"/app.toml 'price-daemon-enabled' -v false # Enable slinky daemon - dasel put -t bool -f "$CONFIG_FOLDER"/app.toml 'slinky-daemon-enabled' -v true - dasel put -t string -f "$VAL_CONFIG_DIR"/app.toml '.oracle.oracle_address' -v 'slinky0:8080' + dasel put -t bool -f "$CONFIG_FOLDER"/app.toml 'oracle.enabled' -v true + dasel put -t string -f "$VAL_CONFIG_DIR"/app.toml 'oracle.oracle_address' -v 'slinky0:8080' + dasel put -t string -f "$VAL_CONFIG_DIR"/app.toml 'slinky-vote-extension-oracle-enabled' -v 'true' } # TODO(DEC-1894): remove this function once we migrate off of persistent peers. diff --git a/protocol/testutil/app/app.go b/protocol/testutil/app/app.go index 769df56f6d..2b54364476 100644 --- a/protocol/testutil/app/app.go +++ b/protocol/testutil/app/app.go @@ -1259,6 +1259,7 @@ func launchValidatorInDir( appConfig.API.Enable = false // We disable telemetry since multiple instances of the application fail to register causing a panic. appConfig.Telemetry.Enabled = false + appConfig.Oracle.MetricsEnabled = false return s, appConfig }, // Capture the application instance. @@ -1286,6 +1287,8 @@ func launchValidatorInDir( "false", "--bridge-daemon-eth-rpc-endpoint", "https://eth-sepolia.g.alchemy.com/v2/demo", + "--oracle.enabled=false", + "--oracle.metrics_enabled=false", }) ctx := svrcmd.CreateExecuteContext(parentCtx) diff --git a/protocol/testutil/appoptions/app_options.go b/protocol/testutil/appoptions/app_options.go index b7a0db07d1..81731e3ae6 100644 --- a/protocol/testutil/appoptions/app_options.go +++ b/protocol/testutil/appoptions/app_options.go @@ -49,6 +49,12 @@ func GetDefaultTestAppOptions(homePath string, customFlags map[string]interface{ // Disable the Price Daemon for all end-to-end and integration tests by default. fao.Set(daemonflags.FlagPriceDaemonEnabled, false) + // Disable the Slinky Daemon for all end-to-end and integration tests by default. + fao.Set(daemonflags.FlagOracleEnabled, false) + + // Disable Slinky Metrics for all end-to-end and integration tests by default. + fao.Set(daemonflags.FlagOracleMetricsEnabled, false) + // Disable the Bridge Daemon for all end-to-end and integration tests by default. fao.Set(daemonflags.FlagBridgeDaemonEnabled, false) diff --git a/protocol/x/clob/client/cli/cancel_order_cli_test.go b/protocol/x/clob/client/cli/cancel_order_cli_test.go index 933e9082fe..9905f98bee 100644 --- a/protocol/x/clob/client/cli/cancel_order_cli_test.go +++ b/protocol/x/clob/client/cli/cancel_order_cli_test.go @@ -73,6 +73,7 @@ func (s *CancelOrderIntegrationTestSuite) SetupTest() { // Disable the Bridge and Price daemons in the integration tests. appOptions.Set(daemonflags.FlagPriceDaemonEnabled, false) appOptions.Set(daemonflags.FlagBridgeDaemonEnabled, false) + appOptions.Set(daemonflags.FlagOracleEnabled, false) // Effectively disable the health monitor panic timeout for these tests. This is necessary // because all clob cli tests are running in the same process and the total time to run is >> 5 minutes diff --git a/protocol/x/clob/client/cli/liquidations_cli_test.go b/protocol/x/clob/client/cli/liquidations_cli_test.go index 89aaa4b2b6..4f85898114 100644 --- a/protocol/x/clob/client/cli/liquidations_cli_test.go +++ b/protocol/x/clob/client/cli/liquidations_cli_test.go @@ -74,6 +74,7 @@ func TestLiquidationOrderIntegrationTestSuite(t *testing.T) { // Disable the Bridge and Price daemons in the integration tests. appOptions.Set(daemonflags.FlagPriceDaemonEnabled, false) appOptions.Set(daemonflags.FlagBridgeDaemonEnabled, false) + appOptions.Set(daemonflags.FlagOracleEnabled, false) // Effectively disable the health monitor panic timeout for these tests. This is necessary // because all clob cli tests are running in the same process and the total time to run is >> 5 minutes diff --git a/protocol/x/clob/client/cli/place_order_cli_test.go b/protocol/x/clob/client/cli/place_order_cli_test.go index 331113edf7..92d4fdf467 100644 --- a/protocol/x/clob/client/cli/place_order_cli_test.go +++ b/protocol/x/clob/client/cli/place_order_cli_test.go @@ -68,6 +68,7 @@ func TestPlaceOrderIntegrationTestSuite(t *testing.T) { // Disable the Bridge and Price daemons in the integration tests. appOptions.Set(daemonflags.FlagPriceDaemonEnabled, false) appOptions.Set(daemonflags.FlagBridgeDaemonEnabled, false) + appOptions.Set(daemonflags.FlagOracleEnabled, false) // Effectively disable the health monitor panic timeout for these tests. This is necessary // because all clob cli tests are running in the same process and the total time to run is >> 5 minutes diff --git a/protocol/x/prices/client/cli/prices_cli_test.go b/protocol/x/prices/client/cli/prices_cli_test.go index f4560775a3..76e61cbf2c 100644 --- a/protocol/x/prices/client/cli/prices_cli_test.go +++ b/protocol/x/prices/client/cli/prices_cli_test.go @@ -95,6 +95,7 @@ func (s *PricesIntegrationTestSuite) SetupTest() { // Enable the Price daemon. appOptions.Set(daemonflags.FlagPriceDaemonEnabled, true) appOptions.Set(daemonflags.FlagPriceDaemonLoopDelayMs, 1_000) + appOptions.Set(daemonflags.FlagOracleEnabled, false) homeDir := filepath.Join(testval.Dir, "simd") configs.WriteDefaultPricefeedExchangeToml(homeDir) // must manually create config file. diff --git a/protocol/x/prices/keeper/slinky_adapter_test.go b/protocol/x/prices/keeper/slinky_adapter_test.go index b25fa9ed66..5db09a2cd9 100644 --- a/protocol/x/prices/keeper/slinky_adapter_test.go +++ b/protocol/x/prices/keeper/slinky_adapter_test.go @@ -2,7 +2,6 @@ package keeper_test import ( "fmt" - "github.com/dydxprotocol/v4-chain/protocol/lib/slinky" "testing" oracletypes "github.com/skip-mev/slinky/pkg/types" @@ -103,28 +102,3 @@ func TestBadMarketData(t *testing.T) { _, err = keeper.GetPriceForCurrencyPair(ctx, oracletypes.CurrencyPair{}) require.Error(t, err) } - -func TestMarketPairToCurrencyPair(t *testing.T) { - testCases := []struct { - marketPair string - currencyPairBase string - currencyPairQuote string - shouldFail bool - }{ - {"0-0", "0", "0", false}, - {"0/0", "", "", true}, - {"00", "", "", true}, - } - for _, tc := range testCases { - t.Run(tc.marketPair, func(t *testing.T) { - cp, err := slinky.MarketPairToCurrencyPair(tc.marketPair) - if tc.shouldFail { - require.Error(t, err) - } else { - require.NoError(t, err) - require.Equal(t, tc.currencyPairBase, cp.Base) - require.Equal(t, tc.currencyPairQuote, cp.Quote) - } - }) - } -}