Add support for fetching all supported prices
This commit is contained in:
parent
053c29cf20
commit
2dc14218bf
3
cli.py
3
cli.py
@ -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
25
mev_inspect/coinbase.py
Normal 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
29
mev_inspect/prices.py
Normal 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
|
20
mev_inspect/schemas/coinbase.py
Normal file
20
mev_inspect/schemas/coinbase.py
Normal 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
|
7
mev_inspect/schemas/prices.py
Normal file
7
mev_inspect/schemas/prices.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
|
class Price(BaseModel):
|
||||||
|
token_address: str
|
||||||
|
timestamp_seconds: int
|
||||||
|
usd_price: float
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user