Skip to content

network="gnosis" queries RPC endpoints of other chains (ETH/OP/Base/Arbitrum/Polygon) — 17/20 calls fail, silent false negative #71

Description

@spouletmathis

Interface: MCP (via alter-cli mcp)
Alter version: 1.25.0 (alter-cli, alter-mcp, meta.server_version tous en 1.25.0 — aucun décalage binaire/serveur)
Platform: macOS 26.6.1 (Build 25G76)
Date: 2026-08-14

Résumé

Sur une requête network: "gnosis", le pool d'endpoints inclut des RPC d'autres chaînes (Ethereum, Optimism, Base, Arbitrum, Polygon). 17 appels sur 20 échouent, et le résultat est un faux négatif silencieux (total_active_borrowers: 0) au lieu d'une erreur.

Les 3 endpoints Gnosis valides du pool répondent correctement — le problème n'est pas la disponibilité réseau, mais la sélection d'endpoints.

Repro

alter-cli mcp address.lending_risk_score --json '{
  "pool_address":"0xfb9b496519fca8473fba1af0850b6b8f476bfdb3",
  "variable_debt_token_addresses":["0x69c731ae5f5356a779f44c355abb685d84e5e9e6"],
  "network":"gnosis"
}' --timeout 180

Observé — meta.rpc_metrics.endpoints_used

calls_total: 20, calls_failed: 17

  https://gnosis-mainnet.public.blastapi.io   calls:1 failed:1
  https://rpc.ankr.com/gnosis                 calls:1 failed:1
  https://gnosis.api.onfinality.io/public     calls:1 failed:1
  https://1rpc.io/gnosis                      calls:1 failed:1
  https://gnosis-rpc.publicnode.com           calls:1 failed:None
  https://rpc.gnosischain.com                 calls:1 failed:None
  https://rpc.gnosis.gateway.fm               calls:1 failed:None
  https://rpcfree.com/polygon-rpc             calls:1 failed:1   ← Polygon
  https://cloudflare-eth.com                  calls:1 failed:1   ← Ethereum
  https://eth.drpc.org                        calls:1 failed:1   ← Ethereum
  wss://eth.drpc.org                          calls:1 failed:1   ← Ethereum
  wss://mainnet.gateway.tenderly.co           calls:1 failed:1   ← Ethereum
  https://optimism.drpc.org                   calls:1 failed:1   ← Optimism
  https://base.drpc.org                       calls:1 failed:1   ← Base
  https://arbitrum.drpc.org                   calls:1 failed:1   ← Arbitrum

8 des 15 endpoints appartiennent à d'autres chaînes que Gnosis (chain_id 100).

Santé réelle des RPC (test direct, hors Alter, eth_blockNumber)

OK    https://rpc.gnosischain.com          bloc=47727047  307ms
OK    https://rpc.gnosis.gateway.fm        bloc=47727047  321ms
FAIL  https://gnosis-rpc.publicnode.com    HTTP 403
FAIL  https://gnosis-mainnet.public.blastapi.io  HTTP 403
FAIL  https://rpc.ankr.com/gnosis          pas de 'result'
FAIL  https://1rpc.io/gnosis               HTTP 403

Deux endpoints Gnosis sont pleinement fonctionnels. Alter en a 3 marqués failed: None dans son propre pool, et retourne quand même 0.

Attendu

  1. Une requête network: "gnosis" ne doit interroger que des endpoints de chain_id: 100.
  2. Si des endpoints hors-chaîne restent dans le pool, leurs échecs ne doivent pas compter comme des échecs de la requête.
  3. Avec ≥1 endpoint sain, le résultat doit être correct — ou signalé en erreur explicite, jamais 0 avec note: "No active borrowers found".

Impact

Faux négatif silencieux. Sur ce pool, la vérité terrain mesurée le même jour en RPC direct est :

  • 1473 positions actives, $14 711 302 de dette, 200 liquidables (13,58 %)
  • Alter annonce total_active_borrowers: 0, total_debt_usd: 0.0, avec note: "No active borrowers found for this pool. It may have no outstanding debt"

Un agent qui fait confiance à cette réponse conclut que le pool est vide.

Problème connexe — chain.add ne met pas à jour les RPC

alter-cli mcp chain.add --json '{"chain_id":100,"rpc_urls":["https://rpc.gnosischain.com","https://rpc.gnosis.gateway.fm"],"display_name":"Gnosis"}'
→ {"success": false, "error": "chain_already_exists",
   "message": "A chain with chainId 100 already exists"}

Il n'existe donc aucun moyen de corriger le pool d'endpoints d'une chaîne déjà enregistrée. Souhait : que chain.add soit idempotent (met à jour rpc_urls), ou qu'un chain.set_rpc_urls / chain.refresh(rpc_urls:[...]) existe.

Suggestion

result_confidence vaut partial / rpc_degraded dans ces réponses — c'est le bon signal, mais il est facile à manquer. Avec 17/20 appels en échec, un résultat à zéro mériterait failed plutôt qu'un note en langage naturel affirmant l'absence de dette.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions