45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
import json
|
|
from pathlib import Path
|
|
from typing import Optional
|
|
|
|
from pydantic import parse_obj_as
|
|
|
|
from mev_inspect.schemas.abi import ABI
|
|
from mev_inspect.schemas.traces import Protocol
|
|
|
|
THIS_FILE_DIRECTORY = Path(__file__).parents[0]
|
|
ABI_DIRECTORY_PATH = THIS_FILE_DIRECTORY / "abis"
|
|
|
|
|
|
def get_abi_path(abi_name: str, protocol: Optional[Protocol]) -> Optional[Path]:
|
|
abi_filename = f"{abi_name}.json"
|
|
abi_path = (
|
|
ABI_DIRECTORY_PATH / abi_filename
|
|
if protocol is None
|
|
else ABI_DIRECTORY_PATH / protocol.value / abi_filename
|
|
)
|
|
if abi_path.is_file():
|
|
return abi_path
|
|
|
|
return None
|
|
|
|
|
|
# raw abi, for instantiating contract for queries (as opposed to classification, see below)
|
|
def get_raw_abi(abi_name: str, protocol: Optional[Protocol]) -> Optional[str]:
|
|
abi_path = get_abi_path(abi_name, protocol)
|
|
if abi_path is not None:
|
|
with abi_path.open() as abi_file:
|
|
return abi_file.read()
|
|
|
|
return None
|
|
|
|
|
|
def get_abi(abi_name: str, protocol: Optional[Protocol]) -> Optional[ABI]:
|
|
abi_path = get_abi_path(abi_name, protocol)
|
|
if abi_path is not None:
|
|
with abi_path.open() as abi_file:
|
|
abi_json = json.load(abi_file)
|
|
return parse_obj_as(ABI, abi_json)
|
|
|
|
return None
|