Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update code to use cer-feeds.json
Browse files Browse the repository at this point in the history
cer-feeds.json describes the feeds currently supported by Orcfax. The
file should be added during deployment and will be maintained
separately from this repository.
ross-spencer committed Aug 28, 2024
1 parent 43c1c3a commit 79074ae
Showing 7 changed files with 208 additions and 70 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -132,3 +132,6 @@ dmypy.json

# Pyre type checker
.pyre/

# Custom
*.bk
138 changes: 138 additions & 0 deletions cer-feeds.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
{
"meta": {
"description": "active Orcfax CER feeds",
"version": "2024.08.06.0002"
},
"feeds": [
{
"pair": "ADA-IUSD",
"label": "ADA-iUSD",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "ADA-USDM",
"label": "ADA-USDM",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "ADA-DJED",
"label": "ADA-DJED",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "SHEN-ADA",
"label": "SHEN-ADA",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "MIN-ADA",
"label": "MIN-ADA",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "FACT-ADA",
"label": "FACT-ADA",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "subsidized",
"type": "CER"
},
{
"pair": "ADA-USD",
"label": "ADA-USD",
"interval": 3600,
"deviation": 1,
"source": "cex",
"calculation": "median",
"status": "subsidized",
"type": "CER"
},
{
"pair": "LQ-ADA",
"label": "LQ-ADA",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "SNEK-ADA",
"label": "SNEK-ADA",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "LENFI-ADA",
"label": "LENFI-ADA",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "HUNT-ADA",
"label": "HUNT-ADA",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "IBTC-ADA",
"label": "iBTC-ADA",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
},
{
"pair": "IETH-ADA",
"label": "iETH-ADA",
"interval": 3600,
"deviation": 2,
"source": "dex",
"calculation": "weighted mean",
"status": "showcase",
"type": "CER"
}
]
}
2 changes: 2 additions & 0 deletions requirements/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# requirements for the production project.

certifi==2024.7.4
pydantic==2.8.2
tenacity==9.0.0
websockets==12.0
45 changes: 45 additions & 0 deletions src/price_monitor/feed_helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
"""Helpers for processing feed specification data."""

# pylint: disable=E0611,R0902

import json
import logging

from pydantic.dataclasses import dataclass
from pydantic.tools import parse_obj_as

logger = logging.getLogger(__name__)


@dataclass
class FeedSpec:
pair: str
label: str
interval: int
deviation: int
source: str
calculation: str
status: str
type: str = "CER"


async def read_feed_data(feed_data: str) -> list[FeedSpec]:
""" "Read feed data into memory for use in the script."""
feed_dict = None
with open(feed_data, "r", encoding="utf-8") as json_feeds:
feed_dict = json.loads(json_feeds.read())
logger.info("cer-feeds version: %s", feed_dict["meta"]["version"])
logger.info("number of feeds: %s", len(feed_dict["feeds"]))
feeds = []
for item in feed_dict["feeds"]:
feed = parse_obj_as(FeedSpec, item)
feeds.append(feed)
return feeds


def get_deviation(feed_id: str, feeds: list[FeedSpec]):
"""Retrieve deviation for a given price pair."""
for feed in feeds:
if feed.pair != feed_id:
continue
return feed.deviation
59 changes: 0 additions & 59 deletions src/price_monitor/feeds_to_monitor.py

This file was deleted.

30 changes: 19 additions & 11 deletions src/price_monitor/price_monitor.py
Original file line number Diff line number Diff line change
@@ -31,12 +31,12 @@
from tenacity import retry, wait_exponential

try:
import feeds_to_monitor
import feed_helper
except ModuleNotFoundError:
try:
from src.price_monitor import feeds_to_monitor
from src.price_monitor import feed_helper
except ModuleNotFoundError:
from price_monitor import feeds_to_monitor
from price_monitor import feed_helper


logging.basicConfig(
@@ -63,10 +63,9 @@
POLLING_TIME: Final[str] = 60


def price_request_msg() -> str:
async def parse_feed_data(feed_data: str) -> str:
"""Return a price request message to send to the websocket."""
feeds = [feed.name for feed in feeds_to_monitor.feeds_to_monitor]
return json.dumps({"feed_ids": feeds})
return await feed_helper.read_feed_data(feed_data=feed_data)


def get_user_agent() -> str:
@@ -154,7 +153,7 @@ async def request_new_prices(pairs_to_request: dict, local: bool):
return


async def price_monitor(local: bool = False):
async def price_monitor(feed_data: str, local: bool = False):
"""Passively wait for the datum to broadcast and then publish via
COOP.
@@ -170,10 +169,11 @@ async def price_monitor(local: bool = False):
```
"""
monitor_uri = MONITOR_URI
feeds = price_request_msg()
feeds = await parse_feed_data(feed_data=feed_data)
feeds_to_request = json.dumps({"feed_ids": [feed.pair for feed in feeds]})
try:
while True:
data = await connect_to_websocket(monitor_uri, feeds, local)
data = await connect_to_websocket(monitor_uri, feeds_to_request, local)
values = []
if data.get("error"):
logger.error("error in websocket response: %s", data.get("error"))
@@ -193,7 +193,9 @@ async def price_monitor(local: bool = False):
deviation,
values,
)
feed_deviation = feeds_to_monitor.get_deviation(pair)
feed_deviation = feed_helper.get_deviation(pair.upper(), feeds)
if feed_deviation == 0:
continue
if deviation >= feed_deviation:
pairs_to_request.append(pair)
logger.info(
@@ -233,8 +235,14 @@ def main():
action="store_true",
)

parser.add_argument(
"--feeds",
help="feed data describing feeds being monitored (CER-feeds (JSON))",
required=True,
)

args = parser.parse_args()
asyncio.run(price_monitor(args.local))
asyncio.run(price_monitor(feed_data=args.feeds, local=args.local))


if __name__ == "__main__":
1 change: 1 addition & 0 deletions validator.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export ORCFAX_VALIDATOR=

0 comments on commit 79074ae

Please sign in to comment.