diff --git a/diagnostics/dashboard_portfolio.py b/diagnostics/dashboard_portfolio.py index bcdb99f..f627b09 100644 --- a/diagnostics/dashboard_portfolio.py +++ b/diagnostics/dashboard_portfolio.py @@ -8,7 +8,7 @@ import json import sqlite3 import logging from html import escape as esc -from datetime import datetime +from datetime import datetime, timezone from aiohttp import web from shared_ui import render_page @@ -304,7 +304,7 @@ async def handle_portfolio_page(request): d['nav_per_token'] = nav d['price_nav_ratio'] = ratio coins.append(d) - now = datetime.utcnow() + now = datetime.now(timezone.utc) html = render_portfolio_page(coins, now) return web.Response(text=html, content_type='text/html') finally: @@ -315,7 +315,10 @@ async def handle_nav_ratios(request): """Server-side computed NAV ratios — only returns dates with valid data.""" conn = _get_db(request) try: - days = int(request.query.get('days', '90')) + try: + days = min(int(request.query.get('days', '90')), 365) + except (ValueError, TypeError): + days = 90 rows = conn.execute(""" SELECT name, snapshot_date, price_usd, treasury_multisig_usd, lp_usdc_total, adjusted_circulating_supply @@ -355,7 +358,10 @@ async def handle_nav_ratios(request): async def handle_portfolio_history(request): conn = _get_db(request) try: - days = int(request.query.get('days', '90')) + try: + days = min(int(request.query.get('days', '90')), 365) + except (ValueError, TypeError): + days = 90 rows = conn.execute(""" SELECT * FROM coin_snapshots WHERE snapshot_date >= date('now', ? || ' days') diff --git a/fetch_coins.py b/fetch_coins.py index 430669d..8f56516 100644 --- a/fetch_coins.py +++ b/fetch_coins.py @@ -92,6 +92,8 @@ def load_ownership_coins(): continue chain = fm.get("chain") or {} + if isinstance(chain, str): + chain = {} raise_data = fm.get("raise") or {} ops = fm.get("operations") or {} liq = fm.get("liquidation") or {} @@ -563,8 +565,12 @@ def compute_derived(row, coin): if adj_circ and adj_circ > 0: row["effective_liq_price"] = cash_total / adj_circ if price and price > 0: + original_mcap = row.get("market_cap_usd") row["market_cap_usd"] = price * adj_circ mcap = row["market_cap_usd"] + if original_mcap and abs(mcap - original_mcap) > 1: + logger.debug("%s: adjusted mcap $%.0f (was $%.0f, protocol_owned=%s)", + row.get("name", "?"), mcap, original_mcap, protocol_tokens) if price and price > 0 and row.get("effective_liq_price"): row["delta_pct"] = ((row["effective_liq_price"] / price) - 1) * 100