Documentation ¶
Index ¶
- Variables
- type ExchangeConfigJson
- type ExchangeConfigUpdater
- type ExchangeId
- type ExchangeMarketConfigJson
- type ExchangeQueryConfig
- type ExchangeQueryDetails
- type ExchangeToMarketPrices
- type ExchangeToMarketPricesImpl
- func (exchangeToMarketPrices *ExchangeToMarketPricesImpl) GetAllPrices() map[ExchangeId][]MarketPriceTimestamp
- func (exchangeToMarketPrices *ExchangeToMarketPricesImpl) GetIndexPrice(marketId MarketId, cutoffTime time.Time, resolver types.Resolver) (medianPrice uint64, numPricesMedianized int)
- func (exchangeToMarketPrices *ExchangeToMarketPricesImpl) UpdatePrice(exchangeId ExchangeId, marketPriceTimestamp *MarketPriceTimestamp)
- type Exponent
- type MarketConfig
- type MarketId
- type MarketPriceTimestamp
- type MarketToPrice
- type MutableExchangeMarketConfig
- func (memc *MutableExchangeMarketConfig) Copy() *MutableExchangeMarketConfig
- func (memc *MutableExchangeMarketConfig) Equal(other *MutableExchangeMarketConfig) bool
- func (memc *MutableExchangeMarketConfig) GetMarketIds() []MarketId
- func (memc *MutableExchangeMarketConfig) Validate(marketConfigs []*MutableMarketConfig) error
- type MutableMarketConfig
- type PricefeedMutableMarketConfigs
- type PricefeedMutableMarketConfigsImpl
- func (pfmmc *PricefeedMutableMarketConfigsImpl) AddPriceEncoder(priceEncoder ExchangeConfigUpdater)
- func (pfmmc *PricefeedMutableMarketConfigsImpl) AddPriceFetcher(priceFetcher ExchangeConfigUpdater)
- func (pfmmc *PricefeedMutableMarketConfigsImpl) GetExchangeMarketConfigCopy(id ExchangeId) (mutableExchangeMarketConfig *MutableExchangeMarketConfig, err error)
- func (pfmmc *PricefeedMutableMarketConfigsImpl) GetMarketConfigCopies(markets []MarketId) (mutableMarketConfigs []*MutableMarketConfig, err error)
- func (pfmmc *PricefeedMutableMarketConfigsImpl) UpdateMarkets(marketParams []types.MarketParam) (marketParamErrors map[MarketId]error, err error)
- func (pfmmc *PricefeedMutableMarketConfigsImpl) ValidateAndTransformParams(marketParams []types.MarketParam) (mutableExchangeConfigs map[ExchangeId]*MutableExchangeMarketConfig, ...)
- type UpdateParameters
- type UpdatersForExchange
Constants ¶
This section is empty.
Variables ¶
var (
ErrEmptyMarketPriceUpdate = errors.New("Market price update has length of 0")
)
Functions ¶
This section is empty.
Types ¶
type ExchangeConfigJson ¶
type ExchangeConfigJson struct {
Exchanges []ExchangeMarketConfigJson `json:"exchanges"`
}
ExchangeConfigJson demarshals the exchange configuration json for a particular market. The result is a list of parameters that define how the market is resolved on each supported exchange.
This struct stores data in an intermediate form as it's being assigned to various `ExchangeMarketConfig` objects, which are keyed by exchange id. These objects are not kept past the time the `GetAllMarketParams` API response is parsed, and do not contain an id because the id is expected to be known at the time the object is in use.
func (*ExchangeConfigJson) Validate ¶
func (ecj *ExchangeConfigJson) Validate( exchangeNames []ExchangeId, marketNames map[string]MarketId, ) error
Validate validates the exchange configuration json, checking that required fields are defined and that market and exchange names correspond to valid markets and exchanges.
type ExchangeConfigUpdater ¶
type ExchangeConfigUpdater interface { GetExchangeId() ExchangeId // UpdateMutableExchangeConfig notifies the object that the mutable exchange market configuration // for this object's exchange has been updated with a new configuration. It also provides // the current market configs for all supported markets on the exchange. UpdateMutableExchangeConfig( newExchangeConfig *MutableExchangeMarketConfig, newMarketConfigs []*MutableMarketConfig, ) error }
ExchangeConfigUpdater is the interface that wraps the UpdateMutableExchangeConfig method. ExchangeConfigUpdater objects are keyed by exchange id and receive updates notifying them that the mutable exchange market configuration has been updated, along with the all new configs. This interface is added to avoid import loops that occur when importing the `PriceFetcher` type directly into `PricefeedMutableMarketConfigs`.
type ExchangeId ¶
type ExchangeId = string
ExchangeId is the unique id for an `Exchange` in the `Prices` module. The id will be matched against each exchange's `exchangeName` in the `MarketParam`'s `exchange_config_json`.
type ExchangeMarketConfigJson ¶
type ExchangeMarketConfigJson struct { ExchangeName string `json:"exchangeName"` Ticker string `json:"ticker"` AdjustByMarket string `json:"adjustByMarket,omitempty"` Invert bool `json:"invert,omitempty"` }
ExchangeMarketConfigJson captures per-exchange information for resolving a market, including the ticker and conversion details. It demarshals JSON parameters from the chain for a particular market on a specific exchange.
func (*ExchangeMarketConfigJson) Validate ¶
func (emcj *ExchangeMarketConfigJson) Validate( exchangeIds []ExchangeId, marketNames map[string]MarketId, ) error
Validate validates the exchange market configuration json. It returns an error if the configuration is invalid.
type ExchangeQueryConfig ¶
type ExchangeQueryConfig struct { ExchangeId ExchangeId `json:"exchange_id"` IntervalMs uint32 `json:"interval_ms"` TimeoutMs uint32 `json:"timeout_ms"` MaxQueries uint32 `json:"max_queries"` }
ExchangeQueryConfig contains configuration values for querying an exchange, passed in on startup. The configuration values include
- `ExchangeId`
- `IntervalMs` delay between task-loops where each task-loop sends API requests to an exchange
- `TimeoutMs` max time to wait on an API call to an exchange
- `MaxQueries` max number of API calls made to an exchange per task-loop. This parameter is used for rate limiting requests to the exchange.
For single-market API exchanges, the price fetcher will send approximately MaxQueries API responses into the exchange's buffered channel once every IntervalMs milliseconds. Note: the `ExchangeQueryConfig` will be used in the map of `{ exchangeId, `ExchangeQueryConfig` }` that dictates how the pricefeed client queries for market prices.
type ExchangeQueryDetails ¶
type ExchangeQueryDetails struct { Exchange ExchangeId // Url is the url to query the exchange. Url string // PriceFunction computes a map of tickers to prices from an exchange's response PriceFunction func( response *http.Response, tickerToPriceExponent map[string]int32, resolver types.Resolver, ) ( tickerToPrice map[string]uint64, unavailableTickers map[string]error, err error, ) // IsMultiMarket indicates whether the url query response contains multiple tickers. IsMultiMarket bool }
ExchangeQueryDetails represents the information needed to query a specific exchange.
type ExchangeToMarketPrices ¶
type ExchangeToMarketPrices interface { UpdatePrice( exchangeId ExchangeId, marketPriceTimestamp *MarketPriceTimestamp, ) GetAllPrices() map[ExchangeId][]MarketPriceTimestamp GetIndexPrice( marketId MarketId, cutoffTime time.Time, resolver types.Resolver, ) ( medianPrice uint64, numPricesMedianized int, ) }
ExchangeToMarketPrices maintains price info for multiple exchanges. Each exchange can support prices from multiple market sources. Methods are goroutine safe in the underlying MarketToPrice objects.
func NewExchangeToMarketPrices ¶
func NewExchangeToMarketPrices(exchangeIds []ExchangeId) (ExchangeToMarketPrices, error)
NewExchangeToMarketPrices creates a new ExchangeToMarketPrices. Since `ExchangeToMarketPrices` is not goroutine safe to write to, all key-value store creation is done on initialization. Validation is also done to verify `exchangeIds` is a valid input.
type ExchangeToMarketPricesImpl ¶
type ExchangeToMarketPricesImpl struct { // {k: exchangeId, v: market prices, read-write lock} ExchangeMarketPrices map[ExchangeId]*MarketToPrice }
func (*ExchangeToMarketPricesImpl) GetAllPrices ¶
func (exchangeToMarketPrices *ExchangeToMarketPricesImpl) GetAllPrices() map[ExchangeId][]MarketPriceTimestamp
GetAllPrices returns a map of exchangeIds to a list of all `MarketPriceTimestamps` for the exchange.
func (*ExchangeToMarketPricesImpl) GetIndexPrice ¶
func (exchangeToMarketPrices *ExchangeToMarketPricesImpl) GetIndexPrice( marketId MarketId, cutoffTime time.Time, resolver types.Resolver, ) ( medianPrice uint64, numPricesMedianized int, )
GetIndexPrice returns the index price for a given marketId, disallowing prices that are older than cutoffTime. If no valid prices are found, an error is returned.
func (*ExchangeToMarketPricesImpl) UpdatePrice ¶
func (exchangeToMarketPrices *ExchangeToMarketPricesImpl) UpdatePrice( exchangeId ExchangeId, marketPriceTimestamp *MarketPriceTimestamp, )
UpdatePrice updates a price for a market for an exchange. Prices are only updated if the timestamp on the updates are greater than the timestamp on existing prices. NOTE: `UpdatePrice` will only ever read from `ExchangeMarketPrices` and calls a goroutine-safe method on the fetched `MarketToPrice`. Note: if an invalid `exchangeId` is being written to the `UpdatePrice` it is possible the underlying map was corrupted or the priceDaemon logic is invalid. Therefore, `UpdatePrice` will panic.
type Exponent ¶
type Exponent = int32
Exponent denotes the number of decimals a value should be shifted.
type MarketConfig ¶
type MarketConfig struct { // Ticker specifies the string to use to query the relevant ticker price for a market on this exchange. Ticker string // AdjustByMarket optionally identifies the appropriate market that should be used to adjust // the price of the market ticker to arrive at the final USD price of the market. This is used in // cases where we choose to query a price for a market on a particular exchange in a different quote // currency - perhaps because that market is more robust - and convert the price back to the quote // currency of the original market with another market's price. // // For example, for resolving the BTC-USD price on this exchange, we may use a "BTC-USDT" ticker with // an adjust-by market of USDT-USD, and compute BTC-USD as // // BTC-USD = BTC-USDT * USDT-USD // // If this field is nil, then the market has no adjust-by market. AdjustByMarket *MarketId // Invert specifies the inversion strategy to use when converting the price of the market's ticker to arrive // at the final USD price of the market. The application of the inversion strategy depends on whether an adjust-by // market is defined for this market. // // If an adjust-by market is defined for this market, then the inversion strategy is applied with respect // to the adjustment market. For example, say we use a "BTC-USDT" ticker for USDT-USD on this exchange, with // an adjust-by market of BTC-USD, and an inversion value of true. In this case, we are describing that // we will derive the BTC-USD price by multiplying the BTC-USD index price by the inverse of the BTC-USDT ticker // price: // // USDT-USD = BTC-USD / BTC-USDT // // If an adjust-by market is not defined for this market, then the inversion strategy is applied to the ticker // price itself. For example, for BTC, say we use "USD-BTC" as the BTC-USD ticker on this exchange with an // inversion value of true. In that case, we would derive the BTC-USD price by taking the inverse of the // USD-BTC price: // // BTC-USD = 1 / USD-BTC Invert bool }
MarketConfig specifies the exchange-specific market configuration used to resolve a market's price on a particular exchange.
func (*MarketConfig) Copy ¶
func (mc *MarketConfig) Copy() MarketConfig
Copy returns a deep copy of the MarketConfig.
func (*MarketConfig) Equal ¶
func (mc *MarketConfig) Equal(other MarketConfig) bool
Equal returns true if the two MarketConfigs are equal.
type MarketId ¶
type MarketId = uint32
MarketId is the unique id for a `Market` in the `Prices` module. The id must match the `Prices` module's `Market.Id`.
type MarketPriceTimestamp ¶
MarketPriceTimestamp maintains a `MarketId`, `Price` and `LastUpdatedAt`.
type MarketToPrice ¶
type MarketToPrice struct { sync.Mutex // lock MarketToPriceTimestamp map[uint32]*types.PriceTimestamp // {k: market id, v: PriceTimestamp} }
MarketToPrice maintains multiple prices for different markets for the same exchange, along with the last time that each market price was updated. Methods are goroutine safe.
func NewMarketToPrice ¶
func NewMarketToPrice() *MarketToPrice
NewMarketToPrice creates a new MarketToPrice.
func (*MarketToPrice) GetAllPrices ¶
func (mtp *MarketToPrice) GetAllPrices() []MarketPriceTimestamp
GetAllPrices returns a list of all `MarketPriceTimestamps` for an exchange.
func (*MarketToPrice) GetValidPriceForMarket ¶
func (mtp *MarketToPrice) GetValidPriceForMarket(marketId MarketId, cutoffTime time.Time) (uint64, bool)
GetValidPriceForMarket returns the most recent valid price for a market for an exchange.
func (*MarketToPrice) UpdatePrice ¶
func (mtp *MarketToPrice) UpdatePrice( marketPriceTimestamp *MarketPriceTimestamp, )
UpdatePrice updates a price for a market for an exchange. Prices are only updated if the timestamp on the updates are greater than the timestamp on existing prices.
type MutableExchangeMarketConfig ¶
type MutableExchangeMarketConfig struct { Id ExchangeId // We use the keys of MarketToMarketConfig to infer which markets are supported // by the exchange. MarketToMarketConfig map[MarketId]MarketConfig }
MutableExchangeMarketConfig stores all mutable market configuration per exchange.
func (*MutableExchangeMarketConfig) Copy ¶
func (memc *MutableExchangeMarketConfig) Copy() *MutableExchangeMarketConfig
Copy returns a copy of the MutableExchangeMarketConfig.
func (*MutableExchangeMarketConfig) Equal ¶
func (memc *MutableExchangeMarketConfig) Equal(other *MutableExchangeMarketConfig) bool
Equal returns true if the two MutableExchangeMarketConfig objects are equal.
func (*MutableExchangeMarketConfig) GetMarketIds ¶
func (memc *MutableExchangeMarketConfig) GetMarketIds() []MarketId
GetMarketIds returns the ordered list of market ids supported by the exchange. This set is currently implicitly defined by the keys of the MarketToTicker map.
func (*MutableExchangeMarketConfig) Validate ¶
func (memc *MutableExchangeMarketConfig) Validate(marketConfigs []*MutableMarketConfig) error
type MutableMarketConfig ¶
MutableMarketConfig stores the metadata that is common to a market across exchanges.
func (*MutableMarketConfig) Copy ¶
func (mmc *MutableMarketConfig) Copy() *MutableMarketConfig
Copy returns a copy of the MutableMarketConfig.
func (*MutableMarketConfig) Validate ¶
func (mmc *MutableMarketConfig) Validate() error
type PricefeedMutableMarketConfigs ¶
type PricefeedMutableMarketConfigs interface { AddPriceFetcher(updater ExchangeConfigUpdater) AddPriceEncoder(updater ExchangeConfigUpdater) UpdateMarkets(marketParams []types.MarketParam) (marketParamErrors map[MarketId]error, err error) GetExchangeMarketConfigCopy( id ExchangeId, ) ( mutableExchangeMarketConfig *MutableExchangeMarketConfig, err error, ) GetMarketConfigCopies( markets []MarketId, ) ( mutableMarketConfigs []*MutableMarketConfig, err error, ) }
PricefeedMutableMarketConfigs stores a single copy of all market state that can change dynamically and synchronizes access for running go routines within the daemon.
type PricefeedMutableMarketConfigsImpl ¶
type PricefeedMutableMarketConfigsImpl struct { sync.Mutex // contains filtered or unexported fields }
PricefeedMutableMarketConfigsImpl implements PricefeedMutableMarketConfigs.
func NewPriceFeedMutableMarketConfigs ¶
func NewPriceFeedMutableMarketConfigs( canonicalExchangeIds []ExchangeId, ) *PricefeedMutableMarketConfigsImpl
NewPriceFeedMutableMarketConfigs creates a new PricefeedMutableMarketConfigsImpl with no markets assigned to any exchanges. Apply market settings by calling `UpdateMarkets`.
func (*PricefeedMutableMarketConfigsImpl) AddPriceEncoder ¶
func (pfmmc *PricefeedMutableMarketConfigsImpl) AddPriceEncoder( priceEncoder ExchangeConfigUpdater, )
AddPriceEncoder adds a new price encoder to the pricefeed mutable market configs. This method is synchronized.
func (*PricefeedMutableMarketConfigsImpl) AddPriceFetcher ¶
func (pfmmc *PricefeedMutableMarketConfigsImpl) AddPriceFetcher( priceFetcher ExchangeConfigUpdater, )
AddPriceFetcher adds a new price fetcher to the pricefeed mutable market configs. This method is synchronized.
func (*PricefeedMutableMarketConfigsImpl) GetExchangeMarketConfigCopy ¶
func (pfmmc *PricefeedMutableMarketConfigsImpl) GetExchangeMarketConfigCopy( id ExchangeId, ) ( mutableExchangeMarketConfig *MutableExchangeMarketConfig, err error, )
GetExchangeMarketConfigCopy retrieves a copy of the current market-specific mutable configuration for all markets of an exchange, in order to maintain synchronization. Whenever a market is added or modified on an exchange, this data structure becomes stale.
func (*PricefeedMutableMarketConfigsImpl) GetMarketConfigCopies ¶
func (pfmmc *PricefeedMutableMarketConfigsImpl) GetMarketConfigCopies( markets []MarketId, ) ( mutableMarketConfigs []*MutableMarketConfig, err error, )
GetMarketConfigCopies retrieves a copy of the current market-specific mutable configuration for the specified markets, in order to maintain synchronization. In the event of a market update, this data could become stale. MarketConfigs are returned in the same order as the input markets.
func (*PricefeedMutableMarketConfigsImpl) UpdateMarkets ¶
func (pfmmc *PricefeedMutableMarketConfigsImpl) UpdateMarkets(marketParams []types.MarketParam) ( marketParamErrors map[MarketId]error, err error, )
UpdateMarkets parses the market params, validates them, and updates the pricefeed mutable market configs, broadcasting updates to the price fetchers and encoders when necessary. This method is synchronized. 1. Validate and parse market params into a new set of MutableExchangeMarketConfig and MutableMarketConfig maps. 2. As a sanity check, validate all new configs have 2 entries: a price fetcher and encoder. 3. Pre-compute updates to send to updaters. 4. Take the writer lock on the pricefeed mutable market configs. 5. Swap in new markets and exchange configs. 6. For each changed exchange config, send an update to each updater. UpdateMarkets applies market settings independently. If any market param is invalid, the method will populate marketParamErrors with the error and continue processing the remaining market params. If the entire validation fails, the method will return an error.
func (*PricefeedMutableMarketConfigsImpl) ValidateAndTransformParams ¶
func (pfmmc *PricefeedMutableMarketConfigsImpl) ValidateAndTransformParams(marketParams []types.MarketParam) ( mutableExchangeConfigs map[ExchangeId]*MutableExchangeMarketConfig, mutableMarketConfigs map[MarketId]*MutableMarketConfig, marketParamErrors map[MarketId]error, err error, )
ValidateAndTransformParams validates the market params and transforms them into the internal representation used by the PricefeedMutableMarketConfigsImpl. The method guarantees that the returned mutableExchangeConfigs will have an entry for all current exchange feeds. This method is exposed for testing. MarketParams are validated and applied independently. If any market param is invalid, the method will populate marketParamErrors with the error and continue processing the remaining market params. If the entire validation fails, the method will return an error.
type UpdateParameters ¶
type UpdateParameters struct { ExchangeConfig *MutableExchangeMarketConfig MarketConfigs []*MutableMarketConfig }
UpdateParameters contains the parameters to send to an ExchangeConfigUpdater when the exchange config changes.
type UpdatersForExchange ¶
type UpdatersForExchange struct { PriceFetcher ExchangeConfigUpdater PriceEncoder ExchangeConfigUpdater }
UpdatersForExchange contains named references to all ExchangeConfigUpdaters for a single exchange.
func (*UpdatersForExchange) Validate ¶
func (ufe *UpdatersForExchange) Validate() error
Source Files ¶
- errors.go
- exchange_config_json.go
- exchange_id.go
- exchange_market_config_json.go
- exchange_query_config.go
- exchange_query_details.go
- exchange_to_market_prices.go
- exponent.go
- market_config.go
- market_id.go
- market_price_timestamp.go
- market_to_price.go
- mutable_exchange_config_updater.go
- mutable_exchange_market_config.go
- mutable_market_config.go
- price_feed_mutable_market_configs.go