From 2dc14218bfc102a2397b2f0326f4c6f881c36c7d Mon Sep 17 00:00:00 2001 From: Luke Van Seters Date: Wed, 17 Nov 2021 23:07:25 -0500 Subject: [PATCH] Add support for fetching all supported prices --- cli.py | 3 +++ mev_inspect/coinbase.py | 25 +++++++++++++++++++++++++ mev_inspect/prices.py | 29 +++++++++++++++++++++++++++++ mev_inspect/schemas/coinbase.py | 20 ++++++++++++++++++++ mev_inspect/schemas/prices.py | 7 +++++++ mev_inspect/schemas/utils.py | 2 +- 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 mev_inspect/coinbase.py create mode 100644 mev_inspect/prices.py create mode 100644 mev_inspect/schemas/coinbase.py create mode 100644 mev_inspect/schemas/prices.py diff --git a/cli.py b/cli.py index b1c0acf..5e04f6a 100644 --- a/cli.py +++ b/cli.py @@ -7,6 +7,7 @@ import click from mev_inspect.concurrency import coro from mev_inspect.db import get_inspect_session, get_trace_session from mev_inspect.inspector import MEVInspector +from mev_inspect.prices import fetch_all_supported_prices RPC_URL_ENV = "RPC_URL" @@ -83,6 +84,8 @@ async def inspect_many_blocks_command( @coro async def fetch_all_prices(): print("fetching") + prices = await fetch_all_supported_prices() + print(prices[0]) def get_rpc_url() -> str: diff --git a/mev_inspect/coinbase.py b/mev_inspect/coinbase.py new file mode 100644 index 0000000..857288b --- /dev/null +++ b/mev_inspect/coinbase.py @@ -0,0 +1,25 @@ +import aiohttp + +from mev_inspect.classifiers.specs.weth import WETH_ADDRESS +from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS +from mev_inspect.schemas.coinbase import CoinbasePrices, CoinbasePricesResponse + + +COINBASE_API_BASE = "https://www.coinbase.com/api/v2" +COINBASE_TOKEN_NAMES = { + WETH_ADDRESS: "weth", + ETH_TOKEN_ADDRESS: "ethereum", +} + + +async def fetch_coinbase_prices(token_address: str) -> CoinbasePrices: + if token_address not in COINBASE_TOKEN_NAMES: + raise ValueError(f"Unsupported token_address {token_address}") + + coinbase_token_name = COINBASE_TOKEN_NAMES[token_address] + url = f"{COINBASE_API_BASE}/assets/prices/{coinbase_token_name}" + + async with aiohttp.ClientSession() as session: + async with session.get(url, params={"base": "USD"}) as response: + json_data = await response.json() + return CoinbasePricesResponse(**json_data).data.prices diff --git a/mev_inspect/prices.py b/mev_inspect/prices.py new file mode 100644 index 0000000..8f0ac4a --- /dev/null +++ b/mev_inspect/prices.py @@ -0,0 +1,29 @@ +from typing import List + +from mev_inspect.classifiers.specs.weth import WETH_ADDRESS +from mev_inspect.coinbase import fetch_coinbase_prices +from mev_inspect.schemas.prices import Price +from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS + + +SUPPORTED_TOKENS = [ + WETH_ADDRESS, + ETH_TOKEN_ADDRESS, +] + + +async def fetch_all_supported_prices() -> List[Price]: + prices = [] + + for token_address in SUPPORTED_TOKENS: + coinbase_prices = await fetch_coinbase_prices(token_address) + for usd_price, timestamp_seconds in coinbase_prices.all.prices: + price = Price( + token_address=token_address, + usd_price=usd_price, + timestamp_seconds=timestamp_seconds, + ) + + prices.append(price) + + return prices diff --git a/mev_inspect/schemas/coinbase.py b/mev_inspect/schemas/coinbase.py new file mode 100644 index 0000000..fca7bab --- /dev/null +++ b/mev_inspect/schemas/coinbase.py @@ -0,0 +1,20 @@ +from typing import List, Tuple + +from pydantic import BaseModel + + +class CoinbasePricesEntry(BaseModel): + # tuple of price and timestamp + prices: List[Tuple[float, int]] + + +class CoinbasePrices(BaseModel): + all: CoinbasePricesEntry + + +class CoinbasePricesDataResponse(BaseModel): + prices: CoinbasePrices + + +class CoinbasePricesResponse(BaseModel): + data: CoinbasePricesDataResponse diff --git a/mev_inspect/schemas/prices.py b/mev_inspect/schemas/prices.py new file mode 100644 index 0000000..55abe0f --- /dev/null +++ b/mev_inspect/schemas/prices.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + + +class Price(BaseModel): + token_address: str + timestamp_seconds: int + usd_price: float diff --git a/mev_inspect/schemas/utils.py b/mev_inspect/schemas/utils.py index e3b53f6..1d15876 100644 --- a/mev_inspect/schemas/utils.py +++ b/mev_inspect/schemas/utils.py @@ -1,8 +1,8 @@ import json from hexbytes import HexBytes -from web3.datastructures import AttributeDict from pydantic import BaseModel +from web3.datastructures import AttributeDict def to_camel(string: str) -> str: