From 1923ea592763068939110eb8910e662011bc5261 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Thu, 21 May 2026 16:54:16 +0800 Subject: [PATCH] 1 --- app/services/onchain_monitor.py | 31 ++++++++++++++++++++++++------- tests/test_onchain_tracking.py | 15 +++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/app/services/onchain_monitor.py b/app/services/onchain_monitor.py index 8d87c07..a0fe109 100644 --- a/app/services/onchain_monitor.py +++ b/app/services/onchain_monitor.py @@ -833,13 +833,26 @@ def fetch_nodereal_events(limit=60): return {"metrics": [], "events": [], "errors": ["nodereal_api_key_missing"]} client = _nodereal_client(cfg) enabled_chains = set(cfg.get("nodereal_chains") or DEFAULT_CHAINS) - mappings = [ - m for m in get_token_mappings(min_confidence=MIN_MAPPING_CONFIDENCE) - if str(m.get("chain") or "").lower() in enabled_chains and client.supports_chain(str(m.get("chain") or "").lower()) - ] + all_mappings = get_token_mappings(min_confidence=MIN_MAPPING_CONFIDENCE) + chain_mappings = [m for m in all_mappings if str(m.get("chain") or "").lower() in enabled_chains] + mappings = [] + unsupported_chains = set() + for mapping in chain_mappings: + chain = str(mapping.get("chain") or "").lower() + if client.supports_chain(chain): + mappings.append(mapping) + else: + unsupported_chains.add(chain) metrics = [] events = [] errors = [] + diagnostics = { + "mapping_total": len(all_mappings), + "chain_mapping_total": len(chain_mappings), + "supported_mapping_total": len(mappings), + "enabled_chains": sorted(enabled_chains), + "unsupported_chains": sorted(unsupported_chains), + } lookback = max(1, int(cfg.get("nodereal_log_block_lookback") or 120)) max_logs = max(1, int(cfg.get("nodereal_max_logs_per_token") or 25)) for mapping in mappings[: int(limit or 60)]: @@ -881,9 +894,13 @@ def fetch_nodereal_events(limit=60): events.append(event) except Exception as exc: errors.append(f"{mapping.get('symbol')}:nodereal_logs:{str(exc)[:160]}") - if not mappings: - errors.append("nodereal_no_supported_mappings") - return {"metrics": metrics, "events": events, "errors": errors} + if not all_mappings: + errors.append("nodereal_no_mappings") + elif not chain_mappings: + errors.append("nodereal_no_enabled_chain_mappings:" + json.dumps(diagnostics, ensure_ascii=False, sort_keys=True)) + elif not mappings: + errors.append("nodereal_no_supported_mappings:" + json.dumps(diagnostics, ensure_ascii=False, sort_keys=True)) + return {"metrics": metrics, "events": events, "errors": errors, "diagnostics": diagnostics} def fetch_etherscan_events(limit=60): diff --git a/tests/test_onchain_tracking.py b/tests/test_onchain_tracking.py index 6428e1e..04b3514 100644 --- a/tests/test_onchain_tracking.py +++ b/tests/test_onchain_tracking.py @@ -345,6 +345,21 @@ def test_nodereal_events_generate_metrics_and_normalized_event(monkeypatch, tmp_ assert events["items"][0]["signal_code"] == "whale_accumulation" +def test_nodereal_no_supported_mapping_error_has_diagnostics(monkeypatch, tmp_path): + _temp_db(monkeypatch, tmp_path) + monkeypatch.setenv("ALPHAX_NODEREAL_API_KEY", "test-key") + monkeypatch.setenv("ALPHAX_NODEREAL_CHAINS", "ethereum,bsc") + onchain_db.upsert_token_mapping("SOLX", "solana", "Mint111", source="manual", confidence=95) + + result = onchain_monitor.fetch_nodereal_events(limit=10) + + assert result["metrics"] == [] + assert result["events"] == [] + assert result["diagnostics"]["mapping_total"] == 1 + assert result["diagnostics"]["chain_mapping_total"] == 0 + assert result["errors"][0].startswith("nodereal_no_enabled_chain_mappings:") + + def test_legacy_helius_is_disabled_by_default(monkeypatch, tmp_path): _temp_db(monkeypatch, tmp_path) monkeypatch.setenv("ALPHAX_HELIUS_API_KEY", "test-key")