How does the price feed work?

Introduction

The present version of the Ryze oracle has undergone a number of revisions since the early days of Ryze. When designing the platform our plan was to utilize a 3rd party service provider for our oracle, like Chainlink, Pyth or API3. These service providers have the benefit of being well established and trusted in the DeFi community.

Limitations of existing oracles

Unfortunately after our initial investigations into each of these providers we realized that there are limitations in their oracles which rendered them unsatisfactory for our purposes - the primary limitation being volume traded. During the design phase of Ryze there were issues pertaining to the latency and candle construction (a combination of open, high, low and closing prices for a predefined time-frame). These have been resolved subsequent to the release of Ryze and so we will not discuss them here.

Including volume traded on the Ryze trading screen is important to us, as volume is a critical value in many technical analysis metrics and the exclusion of volume on Ryze would result in a product which did not meet our level of expectations. Furthermore, in our view an oracle price cannot be representative of the market if it does not include volume.

In order to highlight the importance of volume in determining an aggregated market price, here is  an overly simplified example. Assume that only 2 exchanges exist from which prices can be obtained and for the most recent 1 minute timeframe the exchanges provide the following data: Exchange 1 has a price of $100 and $1bn in volume traded over the timeframe and Exchange 2 has a price of $110 and $10m in traded volume.

Most oracles operate on a percentage deviation basis, meaning that any prices from their source exchanges greater than a certain percentage are excluded from the final oracle price. In this example, if this threshold percentage is 5%, the price from Exchange 2 would be excluded entirely and only the price from Exchange 1 would be presented as the final oracle price.

In our view, using the combination of these prices alone would not provide a true reflection of the market's price. Regardless of the percentage differences in the 2 prices, the fact that Exchange 1 has 100 times the volume of Exchange 2 highlights the fact that the true price across the entire market is much closer to $100 than $110. However, because there was a portion of volume traded on Exchange 2, a true market price has to include this in its calculation. In our view the true market price is the volume weighted average price (VWAP) of the 2 exchanges, which leads to a market price, at least in this example, of $100.10 which is very close to, but definitely not the same as, Exchange 1. In some use cases this difference is arbitrary, however with crypto options this can be a very important difference.

Furthermore, in crypto options, it is absolutely critical to reconcile the live price feed to the candles provided by an exchange. The reason for this is that sometimes individual trades, or highs/lows can be missed when only using REST API (which can happen if the price is only fetched for example every second), but this missing ticks could be high or low points in a candle which can influence whether or not a candle closes higher or lower than its opening price - which is the very nature of crypto options. The oracle we use therefore has to have a live websocket price and a candle price which reconciles to ensure that no prices or ticks are missing which might influence the final result.

This more than anything necessitated our need to develop our own oracle. For context, none of our DeFi counterparts display volume in their trading screens as this value is simply not provided from Chainlink, API3 or Pyth, and while we do not know the exact methodology of these oracle providers (since their methodologies are not publicly available) we can be confident that volume is not included since it is not available for their users.

This leads us to how we’ve constructed the Ryze oracle.

The Ryze Oracle Methodology

The methodology behind our oracle is actually very simple. We use the volume weighted average price (VWAP) of the prices across a number of exchanges (currently we are using 4 such exchanges, although this is likely to increase in the future). The resulting price is then checked against the Chainlink low-latency price as a sense check. If the difference between the Ryze oracle price and Chainlink is greater than a predetermined threshold, then the round is canceled and all traders refunded. The reason for this is that if the difference is greater than our reasonability threshold, it means there is an issue somewhere that requires investigation. As mentioned above, Chainlink does not provide a volume value and so the volume number shown on Ryze is always from the Ryze oracle even if the Chainlink price is selected.

Below is an example showing the Ryze price construction.

This is just for the live websocket price which is shown during a round. At the end of each round, the Ryze oracle fetches the most recent candle data from each of the chosen exchanges and checks to make sure that the open, high, low and closing prices from the live price are correct when compared to the exchange candles.

During the beta phase of Ryze, Chainlink was not yet integrated into the Ryze oracle and as such, as some astute community members noted, there were concerns pertaining to the level of trust placed in the Ryze oracle. We therefore sought to include a trusted 3rd party oracle provider with a low deviation tolerance to provide users with confidence in our price feed and the results of trading candles.

The final result is a price which is indicative of the market as a whole, through the inclusion of volume in the calculation, and free from scamwicks and outliers through the comparison with Chainlink. Our oracle is also internally consistent through the reconciliation between the live websocket prices and end of round candles.

Key Features of the Ryze Oracle

The result of the above development is that the Ryze oracle has certain unique benefits and features:

  • Our oracle provides streaming support through websockets with TLS encryption, pushing the price feed at 120bpm up to 3 times every second.
  • This price stream comes with an already constructed trading candle format which is compatible with TradingView and other charting tools.
  • Provides on and off chain candle API support in a gas efficient manner.

Why We Do Not Disclose Our Chosen Exchanges

A natural question is why we do not disclose which exchanges we use in our methodology. The simple answer, security. Given the chance, most informed crypto users would likely guess which exchanges we use and due to the volume traded on most exchanges it would simply be too costly for someone to attempt to move the price of each of these exchanges in order to manipulate the Ryze price. Unfortunately, there are other means through which the price can be manipulated, namely through malicious interruptions and injections into the Ryze application. Simply stated, we do not currently, nor will we ever disclose the source exchanges for the Ryze oracle, for the same reason that Pyth, API3 and Chainlink do not disclose theirs.

Conclusion

It was important for us when designing Ryze that our oracle includes volume, is secure, and operates on a low latency basis. Neither during the development stage nor currently are all 3 of these requirements simultaneously achieved with a third party oracle service provider. Our preference is definitely to only utilize a third party oracle as this makes the ongoing management and maintenance of Ryze significantly less, unfortunately at present we are unable to do so. Nevertheless, we believe that our oracle construction presents a true and fair reflection of the market of each of the Ryze trading pairs and the tolerance check with Chainlink ensures that we have a trusted and reliable third party verifying our price.