Fixed Serum oracle to work better with Serum prices when the code itself is not on mainnet.
This commit is contained in:
parent
9ae3e8a327
commit
ec051037d4
|
@ -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),
|
||||||
|
|
Loading…
Reference in New Issue