Add support for fetching all supported prices

This commit is contained in:
Luke Van Seters 2021-11-17 23:07:25 -05:00
parent 053c29cf20
commit 2dc14218bf
6 changed files with 85 additions and 1 deletions

3
cli.py
View File

@ -7,6 +7,7 @@ import click
from mev_inspect.concurrency import coro from mev_inspect.concurrency import coro
from mev_inspect.db import get_inspect_session, get_trace_session from mev_inspect.db import get_inspect_session, get_trace_session
from mev_inspect.inspector import MEVInspector from mev_inspect.inspector import MEVInspector
from mev_inspect.prices import fetch_all_supported_prices
RPC_URL_ENV = "RPC_URL" RPC_URL_ENV = "RPC_URL"
@ -83,6 +84,8 @@ async def inspect_many_blocks_command(
@coro @coro
async def fetch_all_prices(): async def fetch_all_prices():
print("fetching") print("fetching")
prices = await fetch_all_supported_prices()
print(prices[0])
def get_rpc_url() -> str: def get_rpc_url() -> str:

25
mev_inspect/coinbase.py Normal file
View File

@ -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

29
mev_inspect/prices.py Normal file
View File

@ -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

View File

@ -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

View File

@ -0,0 +1,7 @@
from pydantic import BaseModel
class Price(BaseModel):
token_address: str
timestamp_seconds: int
usd_price: float

View File

@ -1,8 +1,8 @@
import json import json
from hexbytes import HexBytes from hexbytes import HexBytes
from web3.datastructures import AttributeDict
from pydantic import BaseModel from pydantic import BaseModel
from web3.datastructures import AttributeDict
def to_camel(string: str) -> str: def to_camel(string: str) -> str: