Fixed Serum oracle to work better with Serum prices when the code itself is not on mainnet.

This commit is contained in:
Geoff Taylor 2021-07-14 16:34:10 +01:00
parent 9ae3e8a327
commit ec051037d4
1 changed files with 6 additions and 5 deletions

View File

@ -32,6 +32,8 @@ from ...market import AddressableMarket, Market
from ...observables import observable_pipeline_error_reporter from ...observables import observable_pipeline_error_reporter
from ...oracle import Oracle, OracleProvider, OracleSource, Price from ...oracle import Oracle, OracleProvider, OracleSource, Price
from ...serummarket import SerumMarket from ...serummarket import SerumMarket
from ...serummarketlookup import SerumMarketLookup
from ...spltokenlookup import SplTokenLookup
from ...spotmarket import SpotMarket from ...spotmarket import SpotMarket
@ -61,15 +63,17 @@ class SerumOracle(Oracle):
context.cluster = "mainnet-beta" context.cluster = "mainnet-beta"
context.cluster_url = "https://solana-api.projectserum.com" context.cluster_url = "https://solana-api.projectserum.com"
context.client = Client(context.cluster_url) context.client = Client(context.cluster_url)
mainnet_serum_market_lookup: SerumMarketLookup = SerumMarketLookup.load(SplTokenLookup.DefaultDataFilepath)
adjusted_market = mainnet_serum_market_lookup.find_by_symbol(self.market.symbol) or self.market
if self._serum_market is None: if self._serum_market is None:
self._serum_market = RawSerumMarket.load(context.client, self.market.address, context.dex_program_id) self._serum_market = RawSerumMarket.load(context.client, adjusted_market.address, context.dex_program_id)
bids_address = self._serum_market.state.bids() bids_address = self._serum_market.state.bids()
asks_address = self._serum_market.state.asks() asks_address = self._serum_market.state.asks()
bid_ask_account_infos = AccountInfo.load_multiple(context, [bids_address, asks_address]) bid_ask_account_infos = AccountInfo.load_multiple(context, [bids_address, asks_address])
if len(bid_ask_account_infos) != 2: if len(bid_ask_account_infos) != 2:
raise Exception( raise Exception(
f"Failed to get bid/ask data from Serum for market address {self.market.address} (bids: {bids_address}, asks: {asks_address}).") f"Failed to get bid/ask data from Serum for market address {adjusted_market.address} (bids: {bids_address}, asks: {asks_address}).")
bids = OrderBook.from_bytes(self._serum_market.state, bid_ask_account_infos[0].data) bids = OrderBook.from_bytes(self._serum_market.state, bid_ask_account_infos[0].data)
asks = OrderBook.from_bytes(self._serum_market.state, bid_ask_account_infos[1].data) asks = OrderBook.from_bytes(self._serum_market.state, bid_ask_account_infos[1].data)
@ -82,9 +86,6 @@ class SerumOracle(Oracle):
return Price(self.source, datetime.now(), self.market, top_bid_price, mid_price, top_ask_price) return Price(self.source, datetime.now(), self.market, top_bid_price, mid_price, top_ask_price)
def to_streaming_observable(self, context: Context) -> rx.core.typing.Observable: def to_streaming_observable(self, context: Context) -> rx.core.typing.Observable:
context.cluster = "mainnet-beta"
context.cluster_url = "https://solana-api.projectserum.com"
context.client = Client(context.cluster_url)
return rx.interval(1).pipe( return rx.interval(1).pipe(
ops.subscribe_on(context.pool_scheduler), ops.subscribe_on(context.pool_scheduler),
ops.start_with(-1), ops.start_with(-1),