mirror of
https://github.com/autistic-symposium/blockchain-data-engineering-toolkit.git
synced 2025-04-29 12:16:20 -04:00
💾
This commit is contained in:
parent
d9a600a7dc
commit
78549114f6
@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="indexer",
|
name="indexer",
|
||||||
version='0.0.2',
|
version='0.0.3',
|
||||||
packages=find_packages(include=[
|
packages=find_packages(include=[
|
||||||
'src',
|
'src',
|
||||||
'src.blockchains',
|
'src.blockchains',
|
||||||
|
@ -39,7 +39,7 @@ def run_menu() -> argparse.ArgumentParser:
|
|||||||
parser.add_argument('-b', dest='balance', nargs=1,
|
parser.add_argument('-b', dest='balance', nargs=1,
|
||||||
help="Fetch token balance for a given wallet. \
|
help="Fetch token balance for a given wallet. \
|
||||||
Example: indexer -b <wallet address>")
|
Example: indexer -b <wallet address>")
|
||||||
parser.add_argument('-t', dest='top', nargs=1,
|
parser.add_argument('-t', dest='top', action='store_true',
|
||||||
help="Fetch top token holders. \
|
help="Fetch top token holders. \
|
||||||
Example: indexer -t <number of holders>")
|
Example: indexer -t <number of holders>")
|
||||||
parser.add_argument('-g', dest='change', nargs=1,
|
parser.add_argument('-g', dest='change', nargs=1,
|
||||||
@ -82,7 +82,7 @@ def run() -> None:
|
|||||||
elif args.balance:
|
elif args.balance:
|
||||||
fetch_token_balance(env_vars, args.balance[0])
|
fetch_token_balance(env_vars, args.balance[0])
|
||||||
elif args.top:
|
elif args.top:
|
||||||
fetch_top_token_holders(env_vars, args.top[0])
|
fetch_top_token_holders(env_vars)
|
||||||
elif args.change:
|
elif args.change:
|
||||||
fetch_change(env_vars, args.change[0])
|
fetch_change(env_vars, args.change[0])
|
||||||
|
|
||||||
|
@ -4,16 +4,18 @@
|
|||||||
|
|
||||||
|
|
||||||
import pymongo
|
import pymongo
|
||||||
from src.utils import os_utils
|
import src.utils.os_utils as os_utils
|
||||||
|
|
||||||
|
|
||||||
############################################
|
############################################
|
||||||
# Private methods: database #
|
# Private methods: database #
|
||||||
############################################
|
############################################
|
||||||
|
|
||||||
def _get_db_collection(env_vars):
|
def _get_db_collection():
|
||||||
"""Connect to the database."""
|
"""Connect to the database."""
|
||||||
|
|
||||||
|
env_vars = os_utils.load_config()
|
||||||
|
|
||||||
url = env_vars['MONGODB_URL']
|
url = env_vars['MONGODB_URL']
|
||||||
db_name = env_vars['MONGODB_DB_NAME']
|
db_name = env_vars['MONGODB_DB_NAME']
|
||||||
collection = env_vars['MONGODB_COLLECTION_NAME']
|
collection = env_vars['MONGODB_COLLECTION_NAME']
|
||||||
@ -40,11 +42,12 @@ def _balancer_helper(item) -> dict:
|
|||||||
# Public methods: database #
|
# Public methods: database #
|
||||||
############################################
|
############################################
|
||||||
|
|
||||||
async def retrieve_top_balances(top_number: int, env_vars: dict) -> list:
|
async def retrieve_top_balances() -> list:
|
||||||
"""Retrieve top balances from the database."""
|
"""Retrieve top balances from the database."""
|
||||||
|
|
||||||
collection = _get_db_collection(env_vars)
|
top_number = 100
|
||||||
top_balances = collection.find().sort({"balance"}, pymongo.DESCENDING).limit(top_number)
|
collection = _get_db_collection()
|
||||||
|
top_balances = collection.find()#.sort({"balance"}, pymongo.DESCENDING).limit(top_number)
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
counter = 0
|
counter = 0
|
||||||
@ -55,13 +58,13 @@ async def retrieve_top_balances(top_number: int, env_vars: dict) -> list:
|
|||||||
break
|
break
|
||||||
counter += 1
|
counter += 1
|
||||||
|
|
||||||
return result
|
return top_balances
|
||||||
|
|
||||||
|
|
||||||
async def retrieve_balance(wallet: str, env_vars: dict) -> dict:
|
async def retrieve_balance(wallet: str) -> dict:
|
||||||
"""Retrieve balance from the database."""
|
"""Retrieve balance from the database."""
|
||||||
|
|
||||||
collection = _get_db_collection(env_vars)
|
collection = _get_db_collection()
|
||||||
balance = collection.find_one({"wallet": wallet})
|
balance = collection.find_one({"wallet": wallet})
|
||||||
|
|
||||||
if balance:
|
if balance:
|
||||||
@ -70,10 +73,11 @@ async def retrieve_balance(wallet: str, env_vars: dict) -> dict:
|
|||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
async def retrieve_holder_weekly_change(address: str, env_vars: dict) -> int:
|
|
||||||
|
async def retrieve_holder_weekly_change(address: str) -> int:
|
||||||
"""Retrieve weekly change of a given address."""
|
"""Retrieve weekly change of a given address."""
|
||||||
|
|
||||||
collection = _get_db_collection(env_vars)
|
collection = _get_db_collection()
|
||||||
# todo
|
# todo
|
||||||
# get today time
|
# get today time
|
||||||
# get last week time
|
# get last week time
|
||||||
|
@ -7,7 +7,6 @@ from fastapi import APIRouter
|
|||||||
|
|
||||||
from src.server.database import retrieve_balance, retrieve_top_balances, retrieve_holder_weekly_change
|
from src.server.database import retrieve_balance, retrieve_top_balances, retrieve_holder_weekly_change
|
||||||
|
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
@ -20,10 +19,10 @@ async def get_notes() -> dict:
|
|||||||
|
|
||||||
|
|
||||||
@router.get("/balance/{address}")
|
@router.get("/balance/{address}")
|
||||||
async def get_token_balance(env_vars: dict, address: str) -> dict:
|
async def get_token_balance(address: str) -> dict:
|
||||||
"""Get a token balance for a given address."""
|
"""Get a token balance for a given address."""
|
||||||
|
|
||||||
futures = [retrieve_balance(env_vars, address)]
|
futures = [retrieve_balance(address)]
|
||||||
result = await asyncio.gather(*futures)
|
result = await asyncio.gather(*futures)
|
||||||
if result:
|
if result:
|
||||||
return {"result": result}
|
return {"result": result}
|
||||||
@ -32,24 +31,23 @@ async def get_token_balance(env_vars: dict, address: str) -> dict:
|
|||||||
|
|
||||||
|
|
||||||
@router.get("/top")
|
@router.get("/top")
|
||||||
async def get_top_holders(env_vars: dict, top_number=None) -> dict:
|
async def get_top_holders() -> dict:
|
||||||
"""Get top holders of a given token."""
|
"""Get top holders of a given token."""
|
||||||
|
|
||||||
top_number = top_number or 100
|
futures = [retrieve_top_balances()]
|
||||||
|
|
||||||
futures = [retrieve_top_balances(env_vars, top_number)]
|
|
||||||
result = await asyncio.gather(*futures)
|
result = await asyncio.gather(*futures)
|
||||||
if result:
|
if result:
|
||||||
return {"top_holders": result}
|
return {"result": result}
|
||||||
else:
|
else:
|
||||||
return {"error": "No holders found"}
|
return {"error": "No holders found"}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/weekly/{address}")
|
@router.get("/weekly/{address}")
|
||||||
async def get_holder_weekly_change(env_vars: dict, address: str) -> dict:
|
async def get_holder_weekly_change(env_vars: dict, address: str) -> dict:
|
||||||
"""Get weekly change of a given address."""
|
"""Get weekly change of a given address."""
|
||||||
|
|
||||||
futures = [retrieve_holder_weekly_change(env_vars, address)]
|
futures = [retrieve_holder_weekly_change(address)]
|
||||||
result = await asyncio.gather(*futures)
|
result = await asyncio.gather(*futures)
|
||||||
if result:
|
if result:
|
||||||
return {"result": result}
|
return {"result": result}
|
||||||
|
@ -10,7 +10,6 @@ import requests
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from urllib.parse import urlparse
|
|
||||||
|
|
||||||
|
|
||||||
def set_logging(log_level) -> None:
|
def set_logging(log_level) -> None:
|
||||||
@ -94,13 +93,6 @@ def format_path(dir_path, filename) -> str:
|
|||||||
|
|
||||||
return os.path.join(dir_path, filename)
|
return os.path.join(dir_path, filename)
|
||||||
|
|
||||||
|
|
||||||
def format_url(base_url, endpoint) -> str:
|
|
||||||
"""Format a URL full filepath."""
|
|
||||||
|
|
||||||
return urlparse.urljoin(base_url, endpoint)
|
|
||||||
|
|
||||||
|
|
||||||
def save_output(destination, data, mode="w") -> None:
|
def save_output(destination, data, mode="w") -> None:
|
||||||
"""Save data from memory to a destination in disk."""
|
"""Save data from memory to a destination in disk."""
|
||||||
|
|
||||||
@ -168,13 +160,11 @@ def send_post_request(url, headers=None, json=None) -> dict:
|
|||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
def send_get_request(url, params=None) -> dict:
|
def send_get_request(url) -> dict:
|
||||||
"""Send a request to a given URL"""
|
"""Send a request to a given URL"""
|
||||||
|
|
||||||
params = params or {}
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = requests.get(url, params=params)
|
response = requests.get(url)
|
||||||
return response.json()
|
return response.json()
|
||||||
|
|
||||||
except requests.exceptions.HTTPError as e:
|
except requests.exceptions.HTTPError as e:
|
||||||
|
@ -5,11 +5,11 @@
|
|||||||
import src.utils.os_utils as os_utils
|
import src.utils.os_utils as os_utils
|
||||||
|
|
||||||
|
|
||||||
def fetch_token_balance(env_vars, wallet):
|
def fetch_token_balance(ewallet):
|
||||||
"""Test the fetch_token_balance function."""
|
"""Test the fetch_token_balance function."""
|
||||||
|
|
||||||
url = os_utils.format_url(f"{env_vars['API_HOST_URL']}:{env_vars['API_HOST_PORT']}", \
|
endpoint = f"balance/{wallet}"
|
||||||
f"/balance/{wallet}")
|
url = f'http://localhost:80/{endpoint}'
|
||||||
response = os_utils.send_get_request(url)
|
response = os_utils.send_get_request(url)
|
||||||
os_utils.log_info(response)
|
os_utils.log_info(response)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user